Submission #534504

#TimeUsernameProblemLanguageResultExecution timeMemory
534504NhatMinh0208Inside information (BOI21_servers)C++14
100 / 100
1065 ms75296 KiB
#ifndef CPL_TEMPLATE #define CPL_TEMPLATE /* Normie's Template v2.5 Changes: Added warning against using pragmas on USACO. */ // Standard library in one include. #include <bits/stdc++.h> using namespace std; // ordered_set library. #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set(el) tree<el,null_type,less<el>,rb_tree_tag,tree_order_statistics_node_update> // AtCoder library. (Comment out these two lines if you're not submitting in AtCoder.) (Or if you want to use it in other judges, run expander.py first.) //#include <atcoder/all> //using namespace atcoder; //Pragmas (Comment out these three lines if you're submitting in szkopul or USACO.) // #pragma comment(linker, "/stack:200000000") // #pragma GCC optimize("Ofast,unroll-loops,tree-vectorize") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native") //File I/O. #define FILE_IN "cseq.inp" #define FILE_OUT "cseq.out" #define ofile freopen(FILE_IN,"r",stdin);freopen(FILE_OUT,"w",stdout) //Fast I/O. #define fio ios::sync_with_stdio(0);cin.tie(0) #define nfio cin.tie(0) #define endl "\n" //Order checking. #define ord(a,b,c) ((a>=b)and(b>=c)) //min/max redefines, so i dont have to resolve annoying compile errors. #define min(a,b) (((a)<(b))?(a):(b)) #define max(a,b) (((a)>(b))?(a):(b)) // Fast min/max assigns to use with AVX. // Requires g++ 9.2.0. // template<typename T> // __attribute__((always_inline)) void chkmin(T& a, const T& b) { // a=(a<b)?a:b; // } // template<typename T> // __attribute__((always_inline)) void chkmax(T& a, const T& b) { // a=(a>b)?a:b; // } //Constants. #define MOD (ll(998244353)) #define MAX 300001 #define mag 320 const long double PI=3.14159265358979; //Pairs and 3-pairs. #define p1 first #define p2 second.first #define p3 second.second #define fi first #define se second #define pii(element_type) pair<element_type,element_type> #define piii(element_type) pair<element_type,pii(element_type)> //Quick power of 2. #define pow2(x) (ll(1)<<x) //Short for-loops. #define ff(i,__,___) for(int i=__;i<=___;i++) #define rr(i,__,___) for(int i=__;i>=___;i--) //Typedefs. #define bi BigInt typedef long long ll; typedef long double ld; typedef short sh; // Binpow and stuff ll BOW(ll a, ll x, ll p) { if (!x) return 1; ll res=BOW(a,x/2,p); res*=res; res%=p; if (x%2) res*=a; return res%p; } ll INV(ll a, ll p) { return BOW(a,p-2,p); } //---------END-------// #endif vector<pii(int)> gt[120001]; vector<int> req[120001]; int n,m,i,j,k,t,t1,u,v,a,b; int qt[240001]; int qx[240001]; int qy[240001]; int qres[240001]; int inc[120001][20]; int de[120001][20]; int jmp[120001][20]; pii(int) par[120001]; int dep[120001]; void init(int x, pii(int) p) { par[x]=p; dep[x]=dep[p.fi]+1; jmp[x][0]=p.fi; inc[x][0]=p.se; de[x][0]=p.se; int u; for (int i=1;i<20;i++) { u=jmp[x][i-1]; jmp[x][i]=jmp[u][i-1]; if (inc[x][i-1]==-1 || inc[u][i-1]==-1 || inc[x][i-1]>par[u].se) inc[x][i]=-1; else inc[x][i]=inc[u][i-1]; if (de[x][i-1]==-1 || de[u][i-1]==-1 || de[x][i-1]<par[u].se) de[x][i]=-1; else de[x][i]=de[u][i-1]; // cout<<x<<' '<<i<<' '<<jmp[x][i]<<' '<<de[x][i]<<' '<<inc[x][i]<<endl; } for (auto g : gt[x]) if (g.fi-p.fi) init(g.fi, {x,g.se}); } int chk(int u, int v) { if (u==v) return 0; int cu=u,cv=v; int lu=-1e9,lv=1e9; for (int i=19;i>=0;i--) { if (dep[cu]-dep[cv]>=(1<<i)) { if (inc[cu][i]==-1 || lu>par[cu].se) return -1; lu=inc[cu][i]; cu=jmp[cu][i]; } if (dep[cv]-dep[cu]>=(1<<i)) { if (de[cv][i]==-1 || lv<par[cv].se) return -1; lv=de[cv][i]; cv=jmp[cv][i]; } } if (cu==cv) { if (cu==u) { return par[v].se; } else if (cu==v) { return lu; } else assert(0); } else { for (int i=19;i>=0;i--) if (jmp[cu][i]-jmp[cv][i]) { { if (inc[cu][i]==-1 || lu>par[cu].se) return -1; lu=inc[cu][i]; cu=jmp[cu][i]; } { if (de[cv][i]==-1 || lv<par[cv].se) return -1; lv=de[cv][i]; cv=jmp[cv][i]; } } if (lu<=par[cu].se && par[cu].se<=par[cv].se && par[cv].se<=lv) return par[v].se; else return -1; } } set<pii(int)> gts[120001]; int sz[120001]; ordered_set(pii(int)) sus; void init2(int x, pii(int) p) { par[x]=p; if (x==p.fi) { inc[x][0]=1e9; de[x][0]=-1e9; } else { if ((inc[p.fi][0])and(inc[p.fi][0]>=p.se)) inc[x][0]=p.se; else inc[x][0]=0; if ((de[p.fi][0])and(de[p.fi][0]<=p.se)) de[x][0]=p.se; else de[x][0]=0; } // cout<<"init2 "<<x<<' '<<p.fi<<' '<<p.se<<' '<<inc[x][0]<<' '<<de[x][0]<<endl; for (auto g : gts[x]) if (p.fi-g.fi) init2(g.fi, {x,g.se}); } void phase1(int x) { // cout<<"phase 1"<<x<<endl; if (inc[x][0]) { for (auto g : req[x]) { // cout<<"add "<<x<<' '<<g<<' '<<-qt[g]<<' '<<sus.order_of_key(pii(int)(-qt[g]+1,0))<<endl; qres[g]+=sus.order_of_key(pii(int)(-qt[g]+1,0)); } } for (auto g : gts[x]) if (g.fi-par[x].fi) phase1(g.fi); } void phase2(int x) { // cout<<"phase 2 "<<x<<' '<<de[x][0]<<endl; if (de[x][0]) { sus.insert({de[x][0],x}); } for (auto g : gts[x]) if (g.fi-par[x].fi) phase2(g.fi); } void susz(int x, int p) { sz[x]=1; for (auto g : gts[x]) if (g.fi-p) { susz(g.fi,x); sz[x]+=sz[g.fi]; } } void solve(int x) { // cout<<"solving for subtree "<<x<<endl; sus.clear(); susz(x,x); if (sz[x]==1) { for (auto g : req[x]) qres[g]++; return; } int u=x,up=-1,a; // cout<<"finding centroid for "<<x<<endl; while(true) { // cout<<u<<endl; a=0; for (auto g : gts[u]) if (g.fi-up && sz[a]<sz[g.fi]) a=g.fi; if (sz[a]*2<=sz[x] && sz[u]*2>=sz[x]) break; else { up=u; u=a; } } // cout<<"found centroid "<<x<<' '<<u<<endl; init2(u,{u,0}); vector<pii(int)> vec; for (auto g : gts[u]) vec.push_back(g); // for (auto g : vec) cout<<g.fi<<' '; cout<<endl; sort(vec.begin(), vec.end(), [](pii(int) a, pii(int) b){ return (a.se>b.se); }); for (auto g : vec) { sus.insert({g.se,u}); phase1(g.fi); phase2(g.fi); sus.erase({g.se,u}); } sus.insert({0,u}); // for (auto g : sus) cout<<'('<<g.fi<<','<<g.se<<')'<<' '; // cout<<endl; for (auto g : req[u]) { // cout<<"add "<<u<<' '<<g<<' '<<-qt[g]<<' '<<sus.order_of_key(pii(int)(-qt[g]+1,0))<<endl; qres[g]+=sus.order_of_key(pii(int)(-qt[g]+1,0)); } for (auto g : vec) { gts[g.fi].erase({u,g.se}); solve(g.fi); } } int main() { fio; cin>>n>>m; char c; for (i=0;i<n+m-1;i++) { cin>>c; if (c=='S') { t++; qt[i]=t; cin>>qx[i]>>qy[i]; // cout<<qx[i]<<' '<<qy[i]<<' '<<qt[i]<<endl; gt[qx[i]].push_back({qy[i],t}); gt[qy[i]].push_back({qx[i],t}); gts[qx[i]].insert({qy[i],t}); gts[qy[i]].insert({qx[i],t}); } else if (c=='Q') { qt[i]=-t; cin>>qx[i]>>qy[i]; } else if (c=='C') { // return 0; qt[i]=-t; cin>>qx[i]; req[qx[i]].push_back(i); } } init(1,{1,0}); for (i=0;i<n+m-1;i++) if (qt[i]<=0 && qy[i]) { a = chk(qy[i],qx[i]); if (a==-1 || a>(-qt[i])) qres[i]=0; else qres[i]=1; } solve(1); for (i=0;i<n+m-1;i++) if (qt[i]<=0) { if (qy[i]==0) cout<<qres[i]<<endl; else if (qres[i]) cout<<"yes\n"; else cout<<"no\n"; } } // a;
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...