Submission #637946

#TimeUsernameProblemLanguageResultExecution timeMemory
637946IwanttobreakfreeKlasika (COCI20_klasika)C++17
66 / 110
873 ms200604 KiB
#include <iostream> #include <vector> #include <map> using namespace std; int best=0; vector<vector<int>> trie(1,vector<int>(2,-1)); void add(int u,int x){ for(int i=30;i>=0;i--){ if(x&(1<<i)){ if(trie[u][1]==-1){ vector<int> v(2,-1); trie[u][1]=trie.size(); trie.push_back(v); } u=trie[u][1]; } else { if(trie[u][0]==-1){ vector<int> v(2,-1); trie[u][0]=trie.size(); trie.push_back(v); } u=trie[u][0]; } } } int maxi(int u,int x){ int ans=0; for(int i=30;i>=0;i--){ int op=x&(1<<i); if(op)op=1; if(trie[u][1-op]!=-1){ u=trie[u][1-op]; ans+=(1LL*(1<<i)); } else { u=trie[u][op]; } } return ans; } int bin_jump_dist(int a,int dif,vector<vector<int>>& par,vector<vector<int>>& dist){ int ans=0; for(int i=17;i>=0;i--){ if(dif&(1<<i)){ ans^=dist[a][i]; a=par[a][i]; } } return ans; } int bin_jump_node(int a,int dif,vector<vector<int>>& par,vector<vector<int>>& dist){ int ans=0; for(int i=17;i>=0;i--){ if(dif&(1<<i)){ ans^=dist[a][i]; a=par[a][i]; } } return a; } int LCA(int x,int y,vector<vector<int>>& par,vector<vector<int>>& dist,vector<int>& depth){ if(depth[x]>depth[y])swap(x,y); int ans=bin_jump_dist(y,depth[y]-depth[x],par,dist); y=bin_jump_node(y,depth[y]-depth[x],par,dist); //cout<<ans<<'\n'; if(x==y)return ans; for(int i=17;i>=0;i--){ if(par[x][i]!=par[y][i]){ ans^=dist[x][i]; ans^=dist[y][i]; x=par[x][i]; y=par[y][i]; } } return ans^dist[x][0]^dist[y][0]; } void dfs(int a,vector<vector<pair<int,int>>>& g,int cnt,int sol){ best=max(best,cnt^sol); for(auto x:g[a]){ dfs(x.first,g,cnt^x.second,sol); } } int main(){ int q,x,y,sz=1; string s; vector<vector<int>> par(1,vector<int>(18)); vector<vector<int>> w(1,vector<int>(18)); vector<int> depth(1),root1(1); for(int i=0;i<18;i++)par[0][i]=0; vector<vector<pair<int,int>>> g(3000,vector<pair<int,int>>()); add(0,0); cin>>q; for(int qu=0;qu<q;qu++){ cin>>s>>x>>y; if(s=="Add"){ x--; if(q<2001)g[x].push_back({par.size(),y}); depth.push_back(depth[x]+1); root1.push_back(y^root1[x]); add(0,root1.back()); vector<int> parx(18),wx(18); wx[0]=y; parx[0]=x; for(int i=1;i<18;i++){ parx[i]=par[parx[i-1]][i-1]; wx[i]=w[parx[i-1]][i-1]^wx[i-1]; //cout<<wx[i]<<' '; } //cout<<wx[0]<<'\n'; par.push_back(parx); w.push_back(wx); } else{ x--;y--; int sol=LCA(x,y,par,w,depth); best=sol; //cout<<sol<<'\n'; if(q>2000)best=maxi(0,best); else dfs(y,g,0,sol); cout<<best<<'\n'; //cout<<trie.size()<<'\n'; } } }

Compilation message (stderr)

klasika.cpp: In function 'int main()':
klasika.cpp:85:15: warning: unused variable 'sz' [-Wunused-variable]
   85 |     int q,x,y,sz=1;
      |               ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...