Submission #57614

#TimeUsernameProblemLanguageResultExecution timeMemory
57614Bodo171Regions (IOI09_regions)C++14
100 / 100
3039 ms35264 KiB
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=200005;
const int rmax=25005;
const int K=500;//vezi aici
vector<int> v[nmax],in[nmax],out[nmax];
int Up[405][rmax],Down[405][rmax];
int ap[rmax],norm[rmax];
int lev[nmax],w[nmax],col[nmax];
int nr,n,reg,norms,r,q,i,tt,r1,r2;
void defeseu(int x)
{
    ++nr;
    in[col[x]].push_back(nr);
    for(int i=0;i<v[x].size();i++)
       defeseu(v[x][i]);
    out[col[x]].push_back(nr);
}
void dfs(int x)
{
    if(col[x]==reg) lev[x]++,w[x]++;
    for(int i=0;i<v[x].size();i++)
    {
        lev[v[x][i]]=lev[x];
        dfs(v[x][i]);
        w[x]+=w[v[x][i]];
    }
    Up[norms][col[x]]+=lev[x];
    Down[norms][col[x]]+=w[x];
}
int get_ans(int sef,int sub)
{
    int ret=0,p1=0,p2=0;
    for(int i=0;i<in[sub].size();i++)
    {
        while(p1<in[sef].size()&&in[sef][p1]<in[sub][i])
            p1++;
        while(p2<out[sef].size()&&out[sef][p2]<in[sub][i])
            p2++;
        ret+=(p1-p2);
    }
    return ret;
}
int main()
{
    //freopen("data.in","r",stdin);
    cin>>n>>r>>q;
    cin>>col[1];
    for(i=2;i<=n;i++)
    {
        cin>>tt>>col[i];
        v[tt].push_back(i);
        ap[col[i]]++;
    }
    defeseu(1);
    for(reg=1;reg<=r;reg++)
        if(ap[reg]>=K)
    {
        for(i=1;i<=n;i++)
            lev[i]=w[i]=0;
        norm[reg]=++norms;
        dfs(1);
    }
    for(int cnt=1;cnt<=q;cnt++)
    {
        cin>>r1>>r2;
        if(ap[r1]>=K)
        {
            cout<<Up[norm[r1]][r2]<<'\n';
        }
        else
        {
            if(ap[r2]>=K)
            {
                cout<<Down[norm[r2]][r1]<<'\n';
            }
            else
                cout<<get_ans(r1,r2)<<'\n';
        }
        cout.flush();
    }
    return 0;
}

Compilation message (stderr)

regions.cpp: In function 'void defeseu(int)':
regions.cpp:17:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v[x].size();i++)
                 ~^~~~~~~~~~~~
regions.cpp: In function 'void dfs(int)':
regions.cpp:24:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v[x].size();i++)
                 ~^~~~~~~~~~~~
regions.cpp: In function 'int get_ans(int, int)':
regions.cpp:36:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<in[sub].size();i++)
                 ~^~~~~~~~~~~~~~~
regions.cpp:38:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while(p1<in[sef].size()&&in[sef][p1]<in[sub][i])
               ~~^~~~~~~~~~~~~~~
regions.cpp:40:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while(p2<out[sef].size()&&out[sef][p2]<in[sub][i])
               ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...