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 }
View Code

 

posted @ 2019-09-03 19:53  zjxxcn  阅读(140)  评论(0编辑  收藏  举报