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 }

 

posted @ 2018-09-02 19:19  bztMinamoto  阅读(187)  评论(0编辑  收藏  举报
Live2D