Submission #114307

#TimeUsernameProblemLanguageResultExecution timeMemory
114307dorijanlendvajLand of the Rainbow Gold (APIO17_rainbow)C++14
0 / 100
53 ms12908 KiB
#include "rainbow.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #define x first #define y second #define pii pair<int,int> #define pb push_back #define eb emplace_back using namespace std; using namespace __gnu_pbds; using ll=long long; int dx[]={0,1,0,-1,1,1,-1,-1}; int dy[]={1,0,-1,0,1,-1,1,-1}; int n,m; set<pii> s; vector<pii> ou,prr; const int SZ=32987,N=200010; int c1[N],c2[N],c3[N]; vector<pair<ll,int>> ht[SZ],ht1[SZ]; vector<int> sv,sv1; void change(ll i,int x,bool t) { if (t==0) { ll i1=i; i+=1872432922ll; i^=0x95872901; i%=SZ; //cout<<i<<' '<<i1<<endl; for (auto &a: ht[i]) if (a.x==i1) { a.y=x; // cout<<"found"<<endl; return; } //cout<<"made"<<endl; ht[i].pb({i1,x}); sv.pb(i); } else { ll i1=i; i+=1872432922ll; i^=0x95872901; i%=SZ; for (auto &a: ht1[i]) if (a.x==i1) { a.y=x; return; } ht1[i].pb({i1,x}); sv1.pb(i); } } int get(ll i,bool t) { if (t==0) { ll i1=i; i+=1872432922ll; i^=0x95872901; i%=SZ; //cout<<i<<endl; for (auto a: ht[i]) if (a.x==i1) return a.y; return 0; } else { ll i1=i; i+=1872432922ll; i^=0x95872901; i%=SZ; for (auto a: ht1[i]) if (a.x==i1) return a.y; return 0; } } void clearHT(bool t) { if (t==0) { for (auto a: sv) ht[a].clear(); sv.clear(); } else { for (auto a: sv1) ht1[a].clear(); sv1.clear(); } } void init(int R, int C, int sr, int sc, int M, char *S) { set<pii> pros; n=R; m=C; --sr; --sc; for (int i=0;i<M;++i) { //if (s.find({sr,sc})!=s.end()) s.erase({sr,sc}); pros.insert({sr,sc}); if (S[i]=='W') --sc; if (S[i]=='E') ++sc; if (S[i]=='N') --sr; if (S[i]=='S') ++sr; } pros.insert({sr,sc}); for (auto a: pros) prr.pb(a); for (auto a: prr) change(a.x*200000ll+a.y,1,1); //for (auto a: ou) cout<<a.x<<' '<<a.y<<endl; for (int i=0;i<m;++i) { c1[i+1]=c1[i]; if (get(i,1)!=1 && (i==0 || get(i-1,1)==1)) ++c1[i+1]; c2[i+1]=c2[i]; if (get(i+200000,1)!=1 && (i==0 || get(i+199999,1)==1)) ++c2[i+1]; c3[i+1]=c3[i]; int a=(get(i+200000,1)==1)*2+(get(i,1)==1); int b; if (i==0) b=2; else b=(get(i+199999,1)==1)*2+(get(i-1,1)==1); if (b==3 && a!=3) ++c3[i+1]; } } int cnt,z[61][61],par[1000050]; bool bio[100050]; vector<int> sss; bool pos[1000050]; vector<int> nap; //gp_hash_table<ll,int> nodes; void add(int i) { nap.pb(i); par[i]=i; pos[i]=1; ++cnt; } int find(int i) { if (!pos[i]) return -1; if (i==par[i]) return i; return par[i]=find(par[i]); } void merge(int a,int b) { a=find(a); b=find(b); if (a==-1 || b==-1) return; if (a==b) return; par[a]=b; --cnt; } void clear() { for (auto x: nap) { par[x]=-1; pos[x]=0; } nap.clear(); cnt=0; } int colour(int ar, int ac, int br, int bc) { int x1=ar-1,x2=br,y1=ac-1,y2=bc; int ans=(y1 && ((x1==0 && get(y1-1,1)!=1 && get(y1,1)!=1) || (x2==2 && get(y1+200000-1,1)!=1 && get(y1+200000,1)!=1))); if (x1==0) { if (x2==1) return c1[y2]-c1[y1]+ans; else return c3[y2]-c3[y1]+ans; } else return c2[y2]-c2[y1]+ans; }
#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...