一道经典的带修改树链第 \(k\) 大的问题。

我只想出三个 \(\log\) 的解法。。。

整体二分+树剖+树状数组。

那不是暴力随便踩的吗???

不过跑得挺快的。

\(Code\ Below:\)

  1. // luogu-judger-enable-o2
  2. #include <bits/stdc++.h>
  3. #define lowbit(x) ((x)&(-(x)))
  4. using namespace std;
  5. const int maxn=80000+10;
  6. const int lim=1e8;
  7. int n,m,a[maxn],c[maxn],ans[maxn],cnt,num;
  8. int top[maxn],dep[maxn],siz[maxn],son[maxn],fa[maxn],id[maxn],tim;
  9. int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;
  10. struct Query{
  11. int op,x,y,k,id;
  12. }q[maxn*3],q1[maxn*3],q2[maxn*3];
  13. inline int read(){
  14. register int x=0,f=1;char ch=getchar();
  15. while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
  16. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  17. return (f==1)?x:-x;
  18. }
  19. inline void update(int x,int y){
  20. for(;x<=n;x+=lowbit(x)) c[x]+=y;
  21. }
  22. inline int sum(int x){
  23. int ans=0;
  24. for(;x;x-=lowbit(x)) ans+=c[x];
  25. return ans;
  26. }
  27. inline void clear(int x){
  28. for(;x<=n;x+=lowbit(x)){
  29. if(c[x]) c[x]=0;
  30. else break;
  31. }
  32. }
  33. inline void addedge(int x,int y){
  34. to[++tot]=y;
  35. nxt[tot]=head[x];
  36. head[x]=tot;
  37. }
  38. void dfs1(int x,int f){
  39. siz[x]=1;fa[x]=f;
  40. dep[x]=dep[f]+1;
  41. int maxson=-1;
  42. for(int i=head[x],y;i;i=nxt[i]){
  43. y=to[i];
  44. if(y==f) continue;
  45. dfs1(y,x);siz[x]+=siz[y];
  46. if(siz[y]>maxson) maxson=siz[y],son[x]=y;
  47. }
  48. }
  49. void dfs2(int x,int topf){
  50. top[x]=topf;id[x]=++tim;
  51. if(son[x]) dfs2(son[x],topf);
  52. for(int i=head[x],y;i;i=nxt[i]){
  53. y=to[i];
  54. if(y==fa[x]||y==son[x]) continue;
  55. dfs2(y,y);
  56. }
  57. }
  58. inline int query(int x,int y){
  59. int ans=0;
  60. while(top[x]!=top[y]){
  61. if(dep[top[x]]<dep[top[y]]) swap(x,y);
  62. ans+=sum(id[x])-sum(id[top[x]]-1);
  63. x=fa[top[x]];
  64. }
  65. if(dep[x]>dep[y]) swap(x,y);
  66. ans+=sum(id[y])-sum(id[x]-1);
  67. return ans;
  68. }
  69. void solve(int L,int R,int l,int r){
  70. if(L>R) return ;
  71. if(l==r){
  72. for(int i=L;i<=R;i++){
  73. if(q[i].op==1) update(q[i].x,q[i].k);
  74. else {
  75. if(q[i].k<=query(q[i].x,q[i].y)) ans[q[i].id]=l;
  76. else ans[q[i].id]=-1;
  77. }
  78. }
  79. for(int i=L;i<=R;i++)
  80. if(q[i].op==1) clear(q[i].x);
  81. return ;
  82. }
  83. int mid=(l+r)>>1,cnt1=0,cnt2=0,val;
  84. for(int i=L;i<=R;i++){
  85. if(q[i].op==1){
  86. if(q[i].y<=mid) q1[++cnt1]=q[i];
  87. else update(q[i].x,q[i].k),q2[++cnt2]=q[i];
  88. }
  89. else {
  90. val=query(q[i].x,q[i].y);
  91. if(q[i].k>val) q[i].k-=val,q1[++cnt1]=q[i];
  92. else q2[++cnt2]=q[i];
  93. }
  94. }
  95. for(int i=L;i<=R;i++)
  96. if(q[i].op==1&&q[i].y>mid) clear(q[i].x);
  97. for(int i=1;i<=cnt1;i++) q[L+i-1]=q1[i];
  98. for(int i=1;i<=cnt2;i++) q[L+cnt1+i-1]=q2[i];
  99. solve(L,L+cnt1-1,l,mid);solve(L+cnt1,R,mid+1,r);
  100. }
  101. int main()
  102. {
  103. n=read(),m=read();
  104. int k,x,y;
  105. for(int i=1;i<=n;i++) a[i]=read();
  106. for(int i=1;i<n;i++){
  107. x=read(),y=read();
  108. addedge(x,y);addedge(y,x);
  109. }
  110. dfs1(1,0);dfs2(1,1);
  111. for(int i=1;i<=n;i++) q[++cnt]=(Query){1,id[i],a[i],1,0};
  112. while(m--){
  113. k=read(),x=read(),y=read();
  114. if(k==0){
  115. q[++cnt]=(Query){1,id[x],a[x],-1,0};
  116. q[++cnt]=(Query){1,id[x],y,1,0};
  117. a[x]=y;
  118. }
  119. else {
  120. q[++cnt]=(Query){2,x,y,k,++num};
  121. }
  122. }
  123. solve(1,cnt,0,lim);
  124. for(int i=1;i<=num;i++){
  125. if(ans[i]==-1) printf("invalid request!\n");
  126. else printf("%d\n",ans[i]);
  127. }
  128. return 0;
  129. }

[CTSC2008]网络管理(整体二分+树剖+树状数组)的更多相关文章

  1. [CTSC2008]网络管理 [整体二分]

    题面 bzoj luogu 所有事件按时间排序 按值划分下放 把每一个修改 改成一个删除一个插入 对于一个查询 直接查这个段区间有多少合法点 如果查询值大于等于目标值 进入左区间 如果一个查询无解 那 ...

  2. [BZOJ2738]矩阵乘法(整体二分+二维树状数组)

    整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...

  3. 【bzoj2738】矩阵乘法 整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...

  4. P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)

    解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...

  5. BZOJ2738矩阵乘法——整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入   第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...

  6. luogu3250 网络 (整体二分+树上差分+树状数组)

    首先整体二分,问题变成是否存在经过一个点的满足条件的路径 那么我对于每个路径(a,b,lca),在树状数组的dfn[a]++,dfn[b]++,dfn[lca]--,dfn[fa[lca]--] 然后 ...

  7. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  8. BZOJ 2738 矩阵乘法(整体二分+二维树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2738 [题目大意] 给出一个方格图,询问要求求出矩阵内第k小的元素 [题解] 我们对答 ...

  9. 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)

    试题来源 2012中国国家集训队命题答辩 问题描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入格式 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共 ...

随机推荐

  1. Python Tutor

    Python Tutor Python Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程.通过这个工具, ...

  2. 20155312 2016-2017-2 《Java程序设计》第八周学习总结

    20155312 2016-2017-2 <Java程序设计>第八周学习总结 课堂内容总结 学习模式 游乐园模式-荒野求生模式 学习方法 以代码为中心->遇到不会的类和方法(参数等) ...

  3. git .gitignore未生效

    添加进.gitignore的问题未生效. .gitignore只会忽略在.gitignore编写之后的未跟踪(untrack)文件,而在编写.gitignore之前已经add and commit的文 ...

  4. NOIP 2017 d2t2 70points

    革命之路漫漫 第一次尝试 40points spfa #include <bits/stdc++.h> #define read read() using namespace std; i ...

  5. list集合去除重复对象的实现

    下面小编就为大家带来一篇list集合去除重复对象的实现.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 对象重复是指对象里面的变量的值都相等,并不定是地址.list集合存 ...

  6. react组件父传子

    react组件父传子,子组件使用父组件的数据,用props import React, { Component } from 'react'; class App extends Component ...

  7. Interrouter Signals

    summary of traditional NoC interrouter signals summary of SMART interrouter signals flit_valid and f ...

  8. python 基础_字符串9

    凡是重要的# 字符串的创建,字符串可以是单引号创建也可以是双引号创建 str1 = 'hello world' #当你要输出的是单引号的时候,你括起字符串的必须是双引号.当你输出的是双引号的时候,你括 ...

  9. AngularJS的select设置默认值

    AngularJS的select设置默认值 在使用Angular时候使用select标签时会遇到绑定数据指定默认显示值可这样实现 <!DOCTYPE html> <html ng-a ...

  10. 百度地图的js导入及使用

    做页面,地图可能会用到 1 导入百度地图的js库 <script type="text/javascript" src="http://api.map.baidu. ...