[BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树

jzyzoj的p2016

先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔

 
http://blog.csdn.net/jiangyuze831/article/details/41445003
果然我除了抄代码什么也不会......树分块之类的东西完全不会计算复杂度.....
似乎upper_bound非常浪费时间..所以更改的时候直接循环查找不然会超时......
static这种东西不要胡乱用......如果在后面直接赋值会赋值不上........
看代码就能想起来具体内容所以不需要那么详细解释了......
树分块↓
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<cstdlib>
  8 using namespace std;
  9 const int maxn=60010;
 10 int n,m;
 11 int lastans=0;
 12 int f[2*maxn]={};
 13 int ad=0;
 14 struct nod{
 15     int y;
 16     int next;
 17 }e[maxn*2];
 18 struct node{
 19     int num;
 20     int a[1010];
 21     inline int ask(int k){
 22         int fff=upper_bound(a+1,a+num+1,k)-a-1;
 23         return num-fff;
 24     }
 25 }blo[10010];
 26 struct no{
 27     int next[maxn];
 28     int ai[maxn];
 29     int head[maxn];
 30     int shu;
 31     inline void add(int x,int y){
 32         next[++shu]=head[x];
 33         ai[shu]=y;
 34         head[x]=shu;
 35     }
 36 }gre;
 37 int bel[maxn]={};
 38 int tail=0;
 39 int sz;
 40 int a[maxn]={},head[maxn]={};
 41 int tot=0;
 42 inline void init(int x,int y){
 43     e[++tail].next=head[x];
 44     e[tail].y=y;
 45     head[x]=tail;
 46 }
 47 void dfs(int x,int fa){
 48     int now=bel[x];
 49     blo[now].a[++blo[now].num]=a[x];
 50     f[x]=fa;
 51     for(int i=head[x];i;i=e[i].next){
 52         if(e[i].y==fa){
 53             continue;
 54         }
 55         if(blo[now].num<sz){
 56             bel[e[i].y]=now;
 57         }
 58         else{
 59             bel[e[i].y]=++tot;
 60         }
 61         if(bel[e[i].y]!=now){
 62             gre.add(now,bel[e[i].y]);
 63         }
 64         dfs(e[i].y,x);
 65     }
 66 }
 67 int coun(int x,int k){
 68     int ans=blo[x].ask(k);
 69     for(int i=gre.head[x];i;i=gre.next[i]){
 70         ans+=coun(gre.ai[i],k);
 71     }
 72     return ans;
 73 }
 74 int cnt(int x,int fa,int k){
 75     int ans=a[x]>k;
 76     for(int i=head[x];i;i=e[i].next){
 77         if(e[i].y==fa) continue;
 78         if(bel[e[i].y]==bel[x]){
 79             ans+=cnt(e[i].y,x,k);
 80         }
 81         else{
 82             ans+=coun(bel[e[i].y],k);
 83         }
 84     }
 85     return ans;
 86 }
 87 int main(){
 88     //freopen("wtf.in","r",stdin);
 89     //freopen("wtf.out","w",stdout);
 90     memset(e,0,sizeof(e));
 91     memset(blo,0,sizeof(blo));
 92     scanf("%d",&n);
 93     ad=n;
 94     int u,v;
 95     sz=(int)sqrt((double)n);
 96     for(int i=1;i<n;i++){
 97         scanf("%d%d",&u,&v);
 98         init(u,v);
 99         init(v,u);
100     }
101     for(int i=1;i<=n;i++){
102         scanf("%d",&a[i]);
103     }
104     scanf("%d",&m);
105     bel[1]=++tot;
106     dfs(1,0);
107     for(int i=1;i<=tot;++i){
108         sort(blo[i].a+1,blo[i].a+blo[i].num+1);
109     }
110     for(int op,u,x,i=1;i<=m;++i){
111         
112         scanf("%d%d%d",&op,&u,&x);
113         u^=lastans,x^=lastans;
114         if(op==0){
115             printf("%d\n",lastans=cnt(u,f[u],x));
116         }
117         else if(op==1){
118             int fr=bel[u];
119             for(int i=1;i<=blo[fr].num;i++){
120                 if(blo[fr].a[i]==a[u]){
121                     blo[fr].a[i]=a[u]=x;
122                 }
123             }
124             sort(blo[fr].a+1,blo[fr].a+1+blo[fr].num);
125         }
126         else{
127             int fr=bel[u];
128             a[++ad]=x;
129             init(u,ad);
130             f[ad]=u;
131             if(blo[fr].num<sz){
132                 bel[ad]=fr;
133                 blo[fr].a[++blo[fr].num]=x;
134                 sort(blo[fr].a+1,blo[fr].a+1+blo[fr].num);
135             }
136             else{
137                 bel[ad]=++tot;
138                 blo[bel[ad]].a[++blo[bel[ad]].num]=x;
139                 gre.add(fr,bel[ad]);
140             }
141         }
142     }
143     return 0;
144 }
View Code

 

 

posted @ 2017-11-04 16:38  鲸头鹳  阅读(268)  评论(0编辑  收藏  举报