loj 6203
这题我是维护一个操作树,然后在操作树上进行可持久化操作,用倍增每次寻找答案,时间复杂度$O(TlogT)$。 加上读入优化,轻松卡过,最快可以做到$O(T)$,%%%
1 #include<bits/stdc++.h> 2 using namespace std; 3 int const N=1000000+10; 4 unsigned int Hash,n,val[N],fin[N],ty,sum,f[N][20],len[N]; 5 void read(unsigned int &x){ 6 x=0; char c=0; 7 while (!isdigit(c)) c=getchar(); 8 while (isdigit(c)) x=x*10+(c^48),c=getchar(); 9 } 10 int main(){ 11 // freopen("flandre3.in","r",stdin); 12 read(n); read(ty); 13 for(int i=1;i<=n;i++){ 14 unsigned int opt,ver,t; 15 read(opt); 16 if(opt==1){ 17 read(ver); read(t); 18 if(ty) ver^=Hash,t^=Hash; 19 val[++sum]=t; 20 fin[i]=sum; 21 len[i]=len[ver]+1; 22 f[sum][0]=fin[ver]; 23 for(int j=1;j<20;j++) 24 f[sum][j]=f[f[sum][j-1]][j-1]; 25 }else { 26 read(ver); 27 if(ty) ver^=Hash; 28 fin[i]=fin[ver]; 29 len[i]=len[ver]-1; 30 t=fin[ver]; 31 for(int j=0;j<20;j++) 32 if((1<<j)&len[i]) t=f[t][j]; 33 Hash=(Hash*31+val[t]); 34 } 35 } 36 printf("%u\n",Hash); 37 return 0; 38 }