Submission #475285

# Submission time Handle Problem Language Result Execution time Memory
475285 2021-09-21T18:05:47 Z Deepesson Regions (IOI09_regions) C++17
55 / 100
3266 ms 131076 KB
#include <bits/stdc++.h>
#define MAXN 205000
#define REGIOES 25100
#define INI MAXN-5
#define SQRTN 450
int cores[MAXN],array[MAXN],primeiro[MAXN],size[MAXN],cur;
std::vector<int> con[MAXN];
std::vector<int> indices[REGIOES];
int N,R,Q;
int dfs(int pos,int prev){
    array[cur]=cores[pos];
    primeiro[pos]=cur;
    ++cur;
    int res=1;
    for(auto&x:con[pos]){
        if(x==prev)continue;
        res+=dfs(x,pos);
    }
    return size[pos]=res;
}
int tamanho[REGIOES];
bool grandes[REGIOES];
int indicegrandeza[REGIOES];
const int threshold = 167;///Mudar para SQRTN!!!!!!
int slots = 900;
int curg=0;
namespace big {
    int bucket[905][REGIOES];
    int tab[MAXN*4];
    void query(int l,int r,int la=0,int ra=INI,int pos=1){
        if(ra<l||la>r)return;
        if(la>=l&&ra<=r){
            ++tab[pos];
            return;
        }
        int m=(la+ra)/2;
        query(l,r,la,m,pos*2);
        query(l,r,m+1,ra,(pos*2)+1);
    }
    void build(int k,int la=0,int ra=INI,int pos=1){
        if(tab[pos]){
            for(int i=la;i!=ra+1;++i){
                bucket[k][array[i]]+=tab[pos];
            }
            tab[pos]=0;
        }
        if(la==ra)return;
        int m=(la+ra)/2;
        build(k,la,m,pos*2);
        build(k,m+1,ra,(pos*2)+1);
    }
    void preparar(void){
        for(int i=0;i!=REGIOES;++i){
            if(grandes[i]){
                for(auto&x:indices[i]){
                    query(primeiro[x],primeiro[x]+size[x]-1);
                }
                build(indicegrandeza[i]);
            }
        }
    }
    int consulta(int x,int y){
        return bucket[indicegrandeza[x]][y];
    }
}
typedef std::pair<int,int> pii;
namespace small {
    std::vector<pii> tab[MAXN*4];
    int query(int l,int r,int k,int la=0,int ra=INI,int pos=1){
        if(ra<l||la>r)return 0;
        if(la>=l&&ra<=r){
            int l=0,r=tab[pos].size()-1;
            while(l<r){
                int m = (l+r)/2;
                if(tab[pos][m].first>=k){
                    r=m;
                }else l=m+1;
            }
            if(tab[pos][l].first==k)return tab[pos][l].second;return 0;
        }
        int m=(la+ra)/2;
        return query(l,r,k,la,m,pos*2) +
        query(l,r,k,m+1,ra,(pos*2)+1);
    }
    void build(int la=0,int ra=INI,int pos=1){
        for(int i=la;i!=ra+1;++i){
            tab[pos].push_back({array[i],1});
        }
        std::sort(tab[pos].begin(),tab[pos].end());
        {
            std::vector<pii> novo_vetor;
            for(auto&x:tab[pos]){
                if(!novo_vetor.size()||novo_vetor.back().first!=x.first){
                    novo_vetor.push_back(x);
                }else ++novo_vetor.back().second;
            }
            tab[pos]=novo_vetor;
        }
        if(la==ra)return;
        int m=(la+ra)/2;
        build(la,m,pos*2);
        build(m+1,ra,(pos*2)+1);
    }
    int consulta(int a,int b){
        int res=0;
        for(auto&x:indices[a]){
            res+=query(primeiro[x],primeiro[x]+size[x]-1,b);
        }
        return res;
    }
};
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin>>N>>R>>Q;
    std::cin>>cores[0];
    indices[cores[0]].push_back(0);
    for(int i=1;i!=N;++i){
        int a,b;std::cin>>a>>b;--a;
        cores[i]=b;
        indices[b].push_back(i);
        tamanho[b]++;
        con[a].push_back(i);con[i].push_back(a);
    }
    std::vector<pii> tamanhos;

    for(int i=0;i!=REGIOES;++i){
        if(tamanho[i]>=1){
            tamanhos.push_back({tamanho[i],i});
        }
    }
    slots=std::min(slots,(int)tamanhos.size());
    std::sort(tamanhos.begin(),tamanhos.end(),std::greater<pii>());
    for(int i=0;i!=slots;++i){
        grandes[tamanhos[i].second]=true;
        indicegrandeza[tamanhos[i].second]=curg;curg++;
    }
    dfs(0,0);
    big::preparar();
    small::build();
    for(int i=0;i!=Q;++i){
        int a,b;
        std::cin>>a>>b;
        if(grandes[a]){
            std::cout<<big::consulta(a,b)<<std::endl;
        }else {
            std::cout<<small::consulta(a,b)<<std::endl;
        }
    }
}

Compilation message

regions.cpp: In function 'int small::query(int, int, int, int, int, int)':
regions.cpp:79:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   79 |             if(tab[pos][l].first==k)return tab[pos][l].second;return 0;
      |             ^~
regions.cpp:79:63: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   79 |             if(tab[pos][l].first==k)return tab[pos][l].second;return 0;
      |                                                               ^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 226 ms 68916 KB Output is correct
2 Correct 213 ms 68916 KB Output is correct
3 Correct 226 ms 68932 KB Output is correct
4 Correct 254 ms 69008 KB Output is correct
5 Correct 266 ms 69260 KB Output is correct
6 Correct 493 ms 70256 KB Output is correct
7 Correct 408 ms 69836 KB Output is correct
8 Correct 478 ms 70040 KB Output is correct
9 Correct 628 ms 71148 KB Output is correct
10 Correct 766 ms 71972 KB Output is correct
11 Correct 663 ms 71356 KB Output is correct
12 Correct 942 ms 73152 KB Output is correct
13 Correct 798 ms 72372 KB Output is correct
14 Correct 657 ms 71848 KB Output is correct
15 Correct 812 ms 75308 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1397 ms 75524 KB Output is correct
2 Correct 1574 ms 75220 KB Output is correct
3 Correct 2037 ms 78024 KB Output is correct
4 Correct 1593 ms 88824 KB Output is correct
5 Correct 2001 ms 94304 KB Output is correct
6 Correct 2091 ms 100960 KB Output is correct
7 Correct 2307 ms 112740 KB Output is correct
8 Correct 3266 ms 118704 KB Output is correct
9 Runtime error 2396 ms 131076 KB Execution killed with signal 9
10 Runtime error 2518 ms 131076 KB Execution killed with signal 9
11 Runtime error 1886 ms 131076 KB Execution killed with signal 9
12 Runtime error 1962 ms 131076 KB Execution killed with signal 9
13 Runtime error 2501 ms 131076 KB Execution killed with signal 9
14 Runtime error 2101 ms 131076 KB Execution killed with signal 9
15 Runtime error 2613 ms 131076 KB Execution killed with signal 9
16 Runtime error 2528 ms 131076 KB Execution killed with signal 9
17 Runtime error 3057 ms 131076 KB Execution killed with signal 9