Submission #70690

#TimeUsernameProblemLanguageResultExecution timeMemory
70690WA_TLERegions (IOI09_regions)C++14
60 / 100
2945 ms131072 KiB
#include<deque> #include<queue> #include<vector> #include<algorithm> #include<iostream> #include<set> #include<cmath> #include<tuple> #include<string> #include<chrono> #include<functional> #include<iterator> #include<random> #include<unordered_set> #include<array> #include<map> #include<iomanip> #include<assert.h> #include<bitset> #include<stack> #include<memory> using namespace std; typedef long long int llint; typedef long double lldo; #define mp make_pair #define mt make_tuple #define pub push_back #define puf push_front #define pob pop_back #define pof pop_front #define fir first #define sec second #define res resize #define ins insert #define era erase /* cout<<setprecision(20); cin.tie(0); ios::sync_with_stdio(false); */ const llint mod=1000000000; const llint big=2.19e15+1; const long double pai=3.141592653589793238462643383279502884197; const long double eps=1e-15; template <class T,class U>bool mineq(T& a,U b){if(a>b){a=b;return true;}return false;} template <class T,class U>bool maxeq(T& a,U b){if(a<b){a=b;return true;}return false;} llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);} llint lcm(llint a,llint b){if(a==0){return b;}return a/gcd(a,b)*b;} template<class T> void SO(T& ve){sort(ve.begin(),ve.end());} template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());} template<class T>llint LBI(vector<T>&ar,T in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();} template<class T>llint UBI(vector<T>&ar,T in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();} /* 平方分割 R2から来ている人がX以下->愚直 Xよりおおい->前計算 O(nn/X+QlogrX) X=√(nn/Qlogr) O(n√Qlogr) オイラーツアー、累積和、二分探索 */ vector<int>oya; vector<vector<int>>ko; vector<int>tiki; vector<vector<pair<int,int>>>zyowa; vector<vector<int>>maeans; vector<int>maecode; int maenum=0; int dftour=0; vector<int>dfs(int ter){ vector<int> ret(maenum); if(maecode[tiki[ter]]!=-1){ret[maecode[tiki[ter]]]++;} zyowa[tiki[ter]].pub(mp(dftour,1)); dftour++; for(auto it:ko[ter]){ auto aaa=dfs(it); for(int i=0;i<maenum;i++){ret[i]+=aaa[i];} } for(int i=0;i<maenum;i++){maeans[tiki[ter]][i]+=ret[i];} zyowa[tiki[ter]].pub(mp(dftour,-1)); return ret; } int main(void){ int n,R,Q,i;cin>>n>>R>>Q; int X=sqrt(0.8*n*n/(Q*log(n))); zyowa.res(R);oya.res(n);tiki.res(n); ko.res(n);maeans.res(R); cin>>tiki[0]; for(i=1;i<n;i++){cin>>oya[i]>>tiki[i];} for(i=0;i<n;i++){oya[i]--;tiki[i]--;if(oya[i]>=0){ko[oya[i]].pub(i);}} maecode.res(R); for(i=0;i<n;i++){maecode[tiki[i]]++;} for(i=0;i<R;i++){ if(maecode[i]>X){maecode[i]=maenum;maenum++;} else{maecode[i]=-1;} zyowa[i].pub(mp(0,0)); } for(i=0;i<R;i++){maeans[i].res(maenum);} dfs(0); for(i=0;i<R;i++){ int gen=0; for(auto &it:zyowa[i]){gen+=it.sec;it.sec=gen;} } while(Q--){ int a,b;cin>>a>>b;a--;b--; if(maecode[b]!=-1){cout<<maeans[a][maecode[b]]<<endl;continue;} int ans=0; for(i=1;i<zyowa[b].size();i++){ if(zyowa[b][i].sec<zyowa[b][i-1].sec){continue;} int ter=zyowa[b][i].fir; //cerr<<"ter="<<ter<<endl; //terについて調べる int bas=UBI(zyowa[a],mp(ter,869120)); ans+=zyowa[a][bas-1].sec; } cout<<ans<<endl; } return 0; }

Compilation message (stderr)

regions.cpp: In function 'int main()':
regions.cpp:112:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(i=1;i<zyowa[b].size();i++){
           ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...