[BZOJ 720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树
Posted 鲸头鹳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ 720][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 }
以上是关于[BZOJ 720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树的主要内容,如果未能解决你的问题,请参考以下文章
[BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)
JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树
JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块