bzoj3720: Gty的妹子树(树分块)
好珂怕……
树分块是什么东西啊……感觉好暴力……
直接贴一下好了->这里
1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include<vector> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 9 char buf[1<<21],*p1=buf,*p2=buf; 10 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;} 11 inline int read(){ 12 #define num ch-'0' 13 char ch;bool flag=0;int res; 14 while(!isdigit(ch=getc())) 15 (ch=='-')&&(flag=true); 16 for(res=num;isdigit(ch=getc());res=res*10+num); 17 (flag)&&(res=-res); 18 #undef num 19 return res; 20 } 21 char sr[1<<21],z[20];int C=-1,Z; 22 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;} 23 inline void print(int x){ 24 if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x; 25 while(z[++Z]=x%10+48,x/=10); 26 while(sr[++C]=z[Z],--Z);sr[++C]='\n'; 27 } 28 const int N=60005,SIZE=305; 29 int head[N],Next[N<<1],ver[N<<1],tot; 30 inline void add(int u,int v){ 31 ver[++tot]=v,Next[tot]=head[u],head[u]=tot; 32 } 33 int n,m,cnt,w[N],bh[N],bt,fa[N],belong[N],bn[N<<1],bv[N<<1]; 34 struct Block{ 35 vector<int> a; 36 Block(){a.clear();} 37 inline void ins(int x){ 38 a.push_back(x); 39 for(int i=a.size()-1;i;--i) 40 if(a[i-1]>a[i]) swap(a[i-1],a[i]);else break; 41 } 42 inline void update(int x,int k){ 43 int pos=lower_bound(a.begin(),a.end(),x)-a.begin(); 44 a[pos]=k; 45 for(int i=pos;i;--i) 46 if(a[i-1]>a[i]) swap(a[i-1],a[i]);else break; 47 for(int i=pos,s=a.size()-1;i<s;++i) 48 if(a[i]>a[i+1]) swap(a[i],a[i+1]);else break; 49 } 50 inline int query(int x){ 51 return a.end()-upper_bound(a.begin(),a.end(),x); 52 } 53 }bl[N]; 54 inline void add_bl(int u,int v){ 55 bv[++bt]=v,bn[bt]=bh[u],bh[u]=bt; 56 } 57 void dfs(int u,int f){ 58 fa[u]=f; 59 if(bl[belong[f]].a.size()==SIZE){ 60 belong[u]=++cnt; 61 bl[cnt].ins(w[u]); 62 add_bl(belong[f],cnt); 63 } 64 else{ 65 belong[u]=belong[f],bl[belong[u]].ins(w[u]); 66 } 67 for(int i=head[u];i;i=Next[i]){ 68 if(ver[i]!=f) dfs(ver[i],u); 69 } 70 } 71 int dfsbl(int u,int k){ 72 int ans=bl[u].query(k); 73 for(int i=bh[u];i;i=bn[i]) 74 ans+=dfsbl(bv[i],k); 75 return ans; 76 } 77 int dfsans(int u,int k){ 78 int ans=w[u]>k?1:0; 79 for(int i=head[u];i;i=Next[i]){ 80 int v=ver[i]; 81 if(v==fa[u]) continue; 82 if(belong[v]==belong[u]) ans+=dfsans(v,k); 83 else ans+=dfsbl(belong[v],k); 84 } 85 return ans; 86 } 87 int main(){ 88 //freopen("testdata.in","r",stdin); 89 n=read(); 90 for(int i=1;i<n;++i){ 91 int u=read(),v=read();add(u,v),add(v,u); 92 } 93 for(int i=1;i<=n;++i) w[i]=read(); 94 dfs(1,0); 95 m=read(); 96 int ans=0; 97 while(m--){ 98 int opt=read(),u=read(),x=read(); 99 u^=ans,x^=ans; 100 switch(opt){ 101 case 0:ans=dfsans(u,x);print(ans);break; 102 case 1:bl[belong[u]].update(w[u],x);w[u]=x;break; 103 case 2:{ 104 w[++n]=x,add(u,n),fa[n]=u; 105 if(bl[belong[u]].a.size()==SIZE){ 106 belong[n]=++cnt,bl[cnt].ins(w[n]); 107 add_bl(belong[u],cnt); 108 } 109 else{ 110 belong[n]=belong[u],bl[belong[n]].ins(w[n]); 111 } 112 break; 113 } 114 } 115 } 116 Ot(); 117 return 0; 118 }
深深地明白自己的弱小