Submission #578146

#TimeUsernameProblemLanguageResultExecution timeMemory
578146handlenameGame (APIO22_game)C++17
30 / 100
1424 ms262144 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair const int MOD=1e9+7; int n,k; vector<int> adj[300001],rev[300001]; struct node{ node *l,*r; //left node stores stuff which can reach m //right node stores stuff which m can reach int s,m,e; unordered_set<int> stuff; node(int ss,int ee){ s=ss; e=ee; m=(s+e)/2; if (s<e){ l=new node(s,m); r=new node(m+1,e); for (int i=s;i<=m;i++) l->stuff.insert(i); for (int i=m;i<=e;i++) r->stuff.insert(i); } if (s==e){ l=new node(s,-1); r=new node(s,-1); l->stuff.insert(s); r->stuff.insert(s); } } bool upd(int u,int v){ if (e==-1){ stuff.insert(u); stuff.insert(v); return false; } /* cout<<"update "<<s<<' '<<m<<' '<<e<<' '<<u<<' '<<v<<'\n'; cout<<"left: "; for (auto i:l->stuff) cout<<i<<' '; cout<<'\n'; cout<<"right: "; for (auto i:r->stuff) cout<<i<<' '; cout<<'\n'; */ bool uleft=(l->stuff.find(u)!=l->stuff.end()); bool uright=(r->stuff.find(u)!=r->stuff.end()); bool vleft=(l->stuff.find(v)!=l->stuff.end()); bool vright=(r->stuff.find(v)!=r->stuff.end()); if (s==e){ if (uright){ if (vleft) return true; if (!vright){ r->stuff.insert(v); //if (r->upd(u,v)) return true; for (auto i:adj[v]){ if (upd(v,i)) return true; } } } if (vleft){ if (!uleft){ l->stuff.insert(u); //if (l->upd(u,v)) return true; for (auto i:rev[u]){ if (upd(i,u)) return true; } } } return false; } if (uleft){ if (vleft) return l->upd(u,v); if (vright) return false; return false; //v can only reach stuff on right, u->m->right, so u->v->right useless } if (uright){ if (vleft) return true; if (vright) return r->upd(u,v); r->stuff.insert(v); if (r->upd(u,v)) return true; for (auto i:adj[v]){ if (upd(v,i)) return true; } return false; } if (vleft){ l->stuff.insert(u); if (l->upd(u,v)) return true; for (auto i:rev[u]){ if (upd(i,u)) return true; } return false; } if (vright){ return false; //only stuff on left can reach u, left->m->v, so left->u->v useless } return false; } }*root; void init(int N,int K){ n=N; k=K; for (int i=1;i<k;i++){ adj[i].pb(i+1); rev[i+1].pb(i); } root=new node(1,k); } int add_teleporter(int u,int v){ u++; v++; adj[u].pb(v); rev[v].pb(u); if (u>=v && u<=k) return 1; if (u==v) return 0; return root->upd(u,v); }
#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...