其实也没啥好说的

用树状数组可以O(logn)的查询

套一层整体二分就可以做到O(nlngn)

最后用树链剖分让序列上树

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 using namespace std;
  6 inline int read()
  7 {
  8     int x=0,f=1,ch=getchar();
  9     while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
 10     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 11     return x*f;
 12 }
 13 int n,q;
 14 int data[80005];
 15 inline void add(int x,int i)
 16 {
 17     while(x<=n)
 18     {
 19         data[x]+=i;
 20         x+=x&(-x);
 21     }
 22 }
 23 inline int query(int x)
 24 {
 25     int res=0;
 26     while(x>=1)
 27     {
 28         res+=data[x];
 29         x-=x&(-x);
 30     }
 31     return res;
 32 }
 33 int h[80005],next[160005],to[160005],cnt;
 34 inline void addedge(int x,int y)
 35 {
 36     next[cnt]=h[x];
 37     to[cnt]=y;
 38     h[x]=cnt;
 39     cnt++;
 40 }
 41 int size[80005],hson[80005],dep[80005],f[80005];
 42 inline void bfs(int x,int fa)
 43 {
 44     int i;
 45     size[x]=1;
 46     for(i=h[x];i!=-1;i=next[i])
 47     {
 48         if(to[i]==fa)
 49         {
 50             continue;
 51         }
 52         dep[to[i]]=dep[x]+1;
 53         f[to[i]]=x;
 54         bfs(to[i],x);
 55         size[x]+=size[to[i]];
 56         if(size[to[i]]>size[hson[x]])
 57         {
 58             hson[x]=to[i];
 59         }
 60     }
 61 }
 62 int up[80005],first[80005],tim;
 63 inline void spfa(int x,int tt)
 64 {
 65     tim++;
 66     first[x]=tim;
 67     up[x]=tt;
 68     if(!hson[x])
 69     {
 70         return ;
 71     }
 72     spfa(hson[x],tt);
 73     int i;
 74     for(i=h[x];i!=-1;i=next[i])
 75     {
 76         if(to[i]==f[x]||to[i]==hson[x])
 77         {
 78             continue;
 79         }
 80         spfa(to[i],to[i]);
 81     }
 82 }
 83 inline int lca(int x,int y)
 84 {
 85     int res=0;
 86     while(up[x]!=up[y])
 87     {
 88         if(dep[up[x]]<dep[up[y]])
 89         {
 90             swap(x,y);
 91         }
 92         res+=query(first[x])-query(first[up[x]]-1);
 93         x=f[up[x]];
 94     }
 95     if(dep[x]>dep[y])
 96     {
 97         swap(x,y);
 98     }
 99     res+=query(first[y])-query(first[x]-1);
100     return res;
101 }
102 struct stu
103 {
104     int op,l,r,id,x;
105 };
106 stu a[240005];
107 int ans[80005];
108 int m[240005];
109 stu q1[240005],q2[240005];
110 inline void erfen(int l,int r,int sl,int sr)
111 {
112     if(sl>sr)
113     {
114         return ;
115     }
116     if(l==r)
117     {
118         int i;
119         for(i=sl;i<=sr;i++)
120         {
121             if(a[i].op!=2)
122             {
123                 continue;
124             }
125             ans[a[i].id]=l;
126         }
127         return ;
128     }
129     int i,mid=(l+r)>>1,k,cnt1=0,cnt2=0;
130     for(i=sl;i<=sr;i++)
131     {
132         if(a[i].op==0)
133         {
134             if(a[i].x<=mid)
135             {
136                 add(first[a[i].l],1);
137                 m[i]=0;
138             }
139             else
140             {
141                 m[i]=1;
142             }
143             continue;
144         }
145         if(a[i].op==1)
146         {
147             if(a[i].x<=mid)
148             {
149                 add(first[a[i].l],-1);
150                 m[i]=0;
151             }
152             else
153             {
154                 m[i]=1;
155             }
156             continue;
157         }
158         if(a[i].op==2)
159         {
160             k=lca(a[i].l,a[i].r);
161             if(k<a[i].x)
162             {
163                 a[i].x-=k;
164                 m[i]=1;
165             }
166             else
167             {
168                 m[i]=0;
169             }
170         }
171     }
172     for(i=sl;i<=sr;i++)
173     {
174         if(a[i].op==0)
175         {
176             if(a[i].x<=mid)
177             {
178                 add(first[a[i].l],-1);
179             }
180         }
181         if(a[i].op==1)
182         {
183             if(a[i].x<=mid)
184             {
185                 add(first[a[i].l],1);
186             }
187         }
188         if(m[i]==0)
189         {
190             cnt1++;
191             q1[cnt1]=a[i];
192         }
193         else
194         {
195             cnt2++;
196             q2[cnt2]=a[i];
197         }
198     }
199     for(i=1;i<=cnt1;i++)
200     {
201         a[sl+i-1]=q1[i];
202     }
203     for(i=1;i<=cnt2;i++)
204     {
205         a[sl+cnt1+i-1]=q2[i];
206     }
207     erfen(l,mid,sl,sl+cnt1-1);
208     erfen(mid+1,r,sl+cnt1,sr);
209 }
210 int p[80005];
211 int main()
212 {
213     memset(h,-1,sizeof(h));
214     memset(ans,0x3f,sizeof(ans));
215     n=read(),q=read();
216     int i,x,y,tail=0,k,o;
217     for(i=1;i<=n;i++)
218     {
219         x=read();
220         tail++;
221         a[tail].op=0,a[tail].l=i,a[tail].x=x;
222         p[i]=x;
223     }
224     for(i=1;i<n;i++)
225     {
226         x=read(),y=read();
227         addedge(x,y);
228         addedge(y,x);
229     }
230     dep[1]=1;
231     bfs(1,-1);
232     spfa(1,1);
233     for(i=1;i<=n;i++)
234     {
235         add(first[i],1);
236     }
237     for(i=1;i<=q;i++)
238     {
239         k=read(),x=read(),y=read();
240         if(k==0)
241         {
242             tail++;
243             a[tail].op=1;a[tail].l=x,a[tail].x=p[x];
244             tail++;
245             a[tail].op=0;a[tail].l=x;a[tail].x=y;
246             p[x]=y;
247         }
248         else
249         {
250             o=lca(x,y);
251             if(o<k)
252             {
253                 ans[i]=-1;
254                 continue;
255             }
256             k=o-k+1;
257             tail++;
258             a[tail].op=2,a[tail].l=x,a[tail].r=y,a[tail].x=k;
259             a[tail].id=i;
260         }
261     }
262     memset(data,0,sizeof(data));
263     erfen(0,100000000,1,tail);
264     for(i=1;i<=q;i++)
265     {
266         if(ans[i]==0x3f3f3f3f)
267         {
268             continue;
269         }
270         if(ans[i]==-1)
271         {
272             puts("invalid request!");
273         }
274         else
275         {
276             printf("%d\n",ans[i]);
277         }
278     }
279     return 0;
280 }

转载于:https://www.cnblogs.com/gcyyzf/p/6209455.html

bzoj1146整体二分+树链剖分+树状数组相关推荐

  1. 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】

    1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...

  2. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  3. 【暖*墟】#树链剖分# 树链剖分学习与练习

    树链剖分 树链剖分是一种优化,将树上最常经过的几条链划为重点,用线段树来优化区间修改和查询. 并且因为在一棵子树中dfs序是连续的,并且在任意一条重链上,dfs序也是连续的, 可以认为轻链是单点修改, ...

  4. HDU 3966-Aragorn's Story 树链剖分+树状数组

    题目链接 题意:有一棵树,每个节点有权值 有三种操作: I c1 c2 k 从节点c1到节点c2的路径上每个节点权值增加k D c1 c2 k 从节点c1到节点c2的路径上每个节点权值减少k Q i ...

  5. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

    模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...

  6. 2017 ACM/ICPC Asia Regional Shenyang Online Ping Ping Ping 树链剖分+树状数组

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题目大意:给出n+1个节点的树( 3<n<10^4),并给出m对点(m<=50 ...

  7. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  8. 【bzoj 3531】 [Sdoi2014]旅行(树链剖分+树套树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1197  Solved: 576 [Submit][Statu ...

  9. 树链剖分——树链剖分模板

    原题 给定一棵树,树中包含 n 个节点(编号 1∼n),其中第 i 个节点的权值为 ai. 初始时,1 号节点为树的根节点. 现在要对该树进行 m 次操作,操作分为以下 4 种类型: 1 u v k, ...

最新文章

  1. 资料分享:推荐一本《李宏毅机器学习》开源电子书!
  2. vue transition动画
  3. 为什么Android要采用Binder作为IPC机制?
  4. Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)
  5. Educational Codeforces Round 75 (Rated for Div. 2) E2. Voting (Hard Version) 贪心
  6. 升级浏览器_星愿浏览器升级至6.3.2000.2001
  7. jqgrid本地数据例子_办公系统私有云公有云和本地化部署,你选哪个?
  8. Lesson4 一阶方程代换法
  9. data标签怎么爬虫_scrapy爬虫笔记(1):scrapy基本使用
  10. 让你相见恨晚的PS技巧分享
  11. 软件设计师证书的作用有多大?
  12. Linux系统发展历史
  13. 数学计算机教学课题,《运用信息技术,优化数学课堂教学》课题方案.doc
  14. VirtualBox调整分辨率
  15. Java语言中抽取word、pdf的四种方法
  16. java 导出加密压缩包 设置 压缩包加密密码 并下载 (springboot+文件工具类)
  17. 基于.net开发chrome核心浏览器【一】
  18. 博弈论(一)--yale
  19. scp 复制多个文件到远程主机
  20. 如何在 Excel 中设置表格格式并进行排序?

热门文章

  1. 为什么要有不同的参考文献格式?
  2. C#利用HttpWebRequest、HttpWebResponse调用12306接口,实现登录、查票、买票。
  3. JS调用新旧windowsMedia的方法
  4. .idea文件在项目中的显示与隐藏
  5. cocoscreator数字增长动画
  6. 玄学资料库(一)NPM、PYPI、DockerHub 备份
  7. 将 MobaXterm 的高亮/突出显示集功能(HighLight sets)移植到 Xshell6 中使用
  8. 深圳服务器托管,影响价格的因素
  9. linux shell 快速掌握
  10. Win10,Win11系统安全中心提醒“找到可能不需要的应用”弹窗,如何关闭?