Submission #475286

# Submission time Handle Problem Language Result Execution time Memory
475286 2021-09-21T18:08:10 Z Deepesson Regions (IOI09_regions) C++17
75 / 100
5689 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 = 500;
int curg=0;
namespace big {
    int bucket[505][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 208 ms 68836 KB Output is correct
2 Correct 210 ms 68848 KB Output is correct
3 Correct 227 ms 68964 KB Output is correct
4 Correct 249 ms 69088 KB Output is correct
5 Correct 262 ms 69172 KB Output is correct
6 Correct 504 ms 70316 KB Output is correct
7 Correct 416 ms 69688 KB Output is correct
8 Correct 482 ms 70060 KB Output is correct
9 Correct 608 ms 71272 KB Output is correct
10 Correct 738 ms 72040 KB Output is correct
11 Correct 646 ms 71236 KB Output is correct
12 Correct 881 ms 73140 KB Output is correct
13 Correct 701 ms 72500 KB Output is correct
14 Correct 668 ms 71948 KB Output is correct
15 Correct 755 ms 75160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1478 ms 75472 KB Output is correct
2 Correct 1536 ms 75164 KB Output is correct
3 Correct 2158 ms 77960 KB Output is correct
4 Correct 1110 ms 80932 KB Output is correct
5 Correct 1487 ms 84728 KB Output is correct
6 Correct 1692 ms 88484 KB Output is correct
7 Correct 1889 ms 95520 KB Output is correct
8 Correct 2740 ms 101380 KB Output is correct
9 Correct 5689 ms 111668 KB Output is correct
10 Runtime error 2029 ms 131076 KB Execution killed with signal 9
11 Runtime error 1540 ms 131076 KB Execution killed with signal 9
12 Correct 3727 ms 114812 KB Output is correct
13 Correct 5135 ms 115712 KB Output is correct
14 Correct 3918 ms 123736 KB Output is correct
15 Runtime error 2054 ms 131076 KB Execution killed with signal 9
16 Runtime error 2235 ms 131076 KB Execution killed with signal 9
17 Runtime error 2221 ms 131076 KB Execution killed with signal 9