Submission #475278

# Submission time Handle Problem Language Result Execution time Memory
475278 2021-09-21T17:53:12 Z Deepesson Regions (IOI09_regions) C++17
70 / 100
8000 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 curg=0;
namespace big {
    int bucket[1201][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<short,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);
    }
    dfs(0,0);
    for(int i=0;i!=REGIOES;++i){
        if(tamanho[i]>threshold){
            indicegrandeza[i]=curg;
            ++curg;
            grandes[i]=true;
        }
    }
    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:78:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   78 |             if(tab[pos][l].first==k)return tab[pos][l].second;return 0;
      |             ^~
regions.cpp:78:63: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   78 |             if(tab[pos][l].first==k)return tab[pos][l].second;return 0;
      |                                                               ^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 203 ms 68900 KB Output is correct
2 Correct 205 ms 68780 KB Output is correct
3 Correct 210 ms 68832 KB Output is correct
4 Correct 213 ms 68820 KB Output is correct
5 Correct 221 ms 68916 KB Output is correct
6 Correct 235 ms 68916 KB Output is correct
7 Correct 257 ms 68908 KB Output is correct
8 Correct 252 ms 68996 KB Output is correct
9 Correct 349 ms 69568 KB Output is correct
10 Correct 394 ms 69360 KB Output is correct
11 Correct 568 ms 69684 KB Output is correct
12 Correct 770 ms 70468 KB Output is correct
13 Correct 708 ms 70236 KB Output is correct
14 Correct 1160 ms 70964 KB Output is correct
15 Correct 1786 ms 74496 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1494 ms 75444 KB Output is correct
2 Correct 1469 ms 74852 KB Output is correct
3 Correct 2162 ms 78108 KB Output is correct
4 Correct 1414 ms 71264 KB Output is correct
5 Correct 1891 ms 72428 KB Output is correct
6 Correct 1081 ms 74548 KB Output is correct
7 Correct 3060 ms 76920 KB Output is correct
8 Correct 5407 ms 84156 KB Output is correct
9 Execution timed out 8086 ms 86224 KB Time limit exceeded
10 Runtime error 2283 ms 131076 KB Execution killed with signal 9
11 Runtime error 1747 ms 131076 KB Execution killed with signal 9
12 Correct 2703 ms 121368 KB Output is correct
13 Correct 3124 ms 122448 KB Output is correct
14 Correct 4906 ms 118268 KB Output is correct
15 Runtime error 2332 ms 131076 KB Execution killed with signal 9
16 Runtime error 2230 ms 131076 KB Execution killed with signal 9
17 Execution timed out 8051 ms 128104 KB Time limit exceeded