답안 #475284

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
475284 2021-09-21T18:04:27 Z Deepesson Regions (IOI09_regions) C++17
55 / 100
3445 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 = 1100;
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<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;
      |                                                               ^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 204 ms 68848 KB Output is correct
2 Correct 227 ms 68952 KB Output is correct
3 Correct 226 ms 68964 KB Output is correct
4 Correct 282 ms 69040 KB Output is correct
5 Correct 277 ms 69172 KB Output is correct
6 Correct 498 ms 70188 KB Output is correct
7 Correct 409 ms 69680 KB Output is correct
8 Correct 523 ms 70152 KB Output is correct
9 Correct 688 ms 71160 KB Output is correct
10 Correct 801 ms 72000 KB Output is correct
11 Correct 655 ms 71340 KB Output is correct
12 Correct 941 ms 73416 KB Output is correct
13 Correct 795 ms 72336 KB Output is correct
14 Correct 568 ms 71780 KB Output is correct
15 Correct 814 ms 75268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1213 ms 75580 KB Output is correct
2 Correct 1609 ms 75316 KB Output is correct
3 Correct 2174 ms 77948 KB Output is correct
4 Correct 1860 ms 93036 KB Output is correct
5 Correct 1964 ms 98984 KB Output is correct
6 Correct 2213 ms 107276 KB Output is correct
7 Correct 2915 ms 121420 KB Output is correct
8 Correct 3445 ms 127228 KB Output is correct
9 Runtime error 2710 ms 131076 KB Execution killed with signal 9
10 Runtime error 2397 ms 131076 KB Execution killed with signal 9
11 Runtime error 2027 ms 131076 KB Execution killed with signal 9
12 Runtime error 2107 ms 131076 KB Execution killed with signal 9
13 Runtime error 2624 ms 131076 KB Execution killed with signal 9
14 Runtime error 2238 ms 131076 KB Execution killed with signal 9
15 Runtime error 2549 ms 131076 KB Execution killed with signal 9
16 Runtime error 2577 ms 131076 KB Execution killed with signal 9
17 Runtime error 3138 ms 131076 KB Execution killed with signal 9