LINK:网络

一棵树 每次添加一条路径 或者删除之前的一条路径 或询问除了不经过某个点之外剩下的最大值。

一个显然的思路 对于一条路径的权值我们直接把权值塞上去 标记永久化一下即可。

考虑如何求答案 一个比较暴力的思想 我们取所某个节点的所有标记 和全局标记从小到大一一比对即可。

这样复杂度还是Q^2的.

可以发现对于一条链的权值 如果不放到链上 而是放到这条链之外的所有的点上 那么我们求答案其实就变成了单点查询。

可以在树剖的时候把要覆盖的链求出来 排个序就得到了补集。(不过这种做法nlog^3 慢了。

还可以优化一下第一种一一比对的做法 直接主席树上二分 因为某个点的所有主席树的并是全集的子集 可以发现这样做事正确的。

但是复杂度是nlog^3(太慢了。有一说一 这里采用树状数组套主席树也行。

删除也好删除主席树上删即可 比堆删要快一点 不过太慢了。

杀器二分。考虑二分 然后就变成了多有>=mid的路径是否都经过了这个点 暴力扫。

复杂度Q^2log 绝杀 一个整体二分,Qlog^2 但是需要解决的问题是 区间赋值单点查询 又回到树剖了么?

考虑树上差分一下 我们只需要维护子树和即可 这样一个log即可。

最终还是建议使用整体二分来做 第一种方法 容易RE什么的常数大 第二种方法就是常数大 第三种方法码量小 常数小 空间小的多。

说一句闲话 没必要O(1)LCA 因为询问Q个我们预处理一下即可。(但是O(1)LCA没倍增写的多 还是写一下吧.

  1. const int MAXN=200010;
  2. int n,Q,cnt,top,num,cc,len;
  3. struct wy
  4. {
  5. int op,x,y,z;
  6. }t[MAXN],tl[MAXN],tr[MAXN];
  7. int dfn[MAXN],f[MAXN][20],Log[MAXN],fir[MAXN],ans[MAXN],c[MAXN];
  8. int lin[MAXN],ver[MAXN],nex[MAXN],d[MAXN],b[MAXN],fa[MAXN],sz[MAXN];
  9. inline int cmp(int x,int y){return d[x]<d[y]?x:y;}
  10. inline void add(int x,int y)
  11. {
  12. ver[++len]=y;nex[len]=lin[x];lin[x]=len;
  13. ver[++len]=x;nex[len]=lin[y];lin[y]=len;
  14. }
  15. inline void dfs(int x,int father)
  16. {
  17. dfn[x]=++cnt;fir[x]=++top;d[x]=d[father]+1;sz[x]=1;
  18. f[top][0]=x;Log[top]=Log[top>>1]+1;fa[x]=father;
  19. go(x)
  20. {
  21. if(tn==father)continue;
  22. dfs(tn,x);
  23. f[++top][0]=x;Log[top]=Log[top>>1]+1;
  24. sz[x]+=sz[tn];
  25. }
  26. }
  27. inline int LCA(int x,int y)
  28. {
  29. x=fir[x];y=fir[y];
  30. if(x>y)swap(x,y);
  31. int w=Log[y-x+1];
  32. return cmp(f[x][w],f[y-(1<<w)+1][w]);
  33. }
  34. inline void discrete()
  35. {
  36. sort(b+1,b+1+cnt);
  37. rep(1,cnt,i)if(i==1||b[i]!=b[i-1])b[++num]=b[i];
  38. rep(1,Q,i)if(op(i)!=2)z(i)=lower_bound(b+1,b+1+num,z(i))-b;
  39. }
  40. inline void add1(int x,int y)
  41. {
  42. if(!x)return;
  43. //cout<<x<<endl;
  44. while(x<=n)
  45. {
  46. c[x]+=y;
  47. x+=x&(-x);
  48. }
  49. }
  50. inline int ask(int x){int cnt=0;while(x)cnt+=c[x],x-=x&(-x);return cnt;}
  51. inline int ask(int x,int y){return ask(y)-ask(x-1);}
  52. inline void solve(int l,int r,int L,int R)
  53. {
  54. if(l>r)return;
  55. if(L==R)
  56. {
  57. rep(l,r,i)if(op(i)==2)ans[z(i)]=L;
  58. return;
  59. }
  60. int mark=0,ql=0,qr=0,mid=(L+R)>>1,ww=0;
  61. rep(l,r,i)
  62. {
  63. if(op(i)!=2)
  64. {
  65. if(z(i)>mid)
  66. {
  67. tr[++qr]=t[i];int lca=LCA(x(i),y(i));ww+=op(i);
  68. add1(dfn[x(i)],op(i));add1(dfn[y(i)],op(i));
  69. add1(dfn[lca],-op(i));add1(dfn[fa[lca]],-op(i));
  70. }
  71. else tl[++ql]=t[i];
  72. }
  73. else
  74. {
  75. int w=ask(x(i),y(i));
  76. if(w==ww)tl[++ql]=t[i];
  77. else tr[++qr]=t[i];
  78. mark=1;
  79. }
  80. }
  81. rep(1,qr,i)if(tr[i].op!=2&&tr[i].z>mid)
  82. {
  83. int lca=LCA(tr[i].x,tr[i].y);
  84. add1(dfn[tr[i].x],-tr[i].op);add1(dfn[tr[i].y],-tr[i].op);
  85. add1(dfn[lca],tr[i].op);add1(dfn[fa[lca]],tr[i].op);
  86. }
  87. if(!mark)return;
  88. rep(1,ql,i)t[l+i-1]=tl[i];
  89. rep(1,qr,i)t[l+ql+i-1]=tr[i];
  90. solve(l,l+ql-1,L,mid);solve(l+ql,r,mid+1,R);
  91. }
  92. int main()
  93. {
  94. freopen("1.in","r",stdin);
  95. get(n);get(Q);Log[0]=-1;
  96. rep(2,n,i)add(read(),read());
  97. dfs(1,0);cnt=0;
  98. rep(1,Log[top],j)rep(1,top-(1<<j)+1,i)
  99. {
  100. f[i][j]=cmp(f[i][j-1],f[i+(1<<(j-1))][j-1]);
  101. //cout<<cmp(f[i][j-1],f[i+(1<<(j-1))][j-1])<<' '<<f[i][j-1]<<' '<<f[i+(1<<(j-1))][j-1]<<endl;
  102. }
  103. rep(1,Q,i)
  104. {
  105. get(op(i));
  106. if(op(i)==0)
  107. {
  108. get(x(i));get(y(i));get(z(i));
  109. b[++cnt]=z(i);op(i)=1;
  110. continue;
  111. }
  112. if(op(i)==1)
  113. {
  114. int w;get(w);
  115. x(i)=x(w);y(i)=y(w);z(i)=z(w);
  116. //cout<<x(i)<<' '<<y(i)<<endl;
  117. op(i)=-1;
  118. }
  119. if(op(i)==2)
  120. {
  121. int w;get(w);
  122. x(i)=dfn[w];
  123. y(i)=x(i)+sz[w]-1,z(i)=++cc;
  124. }
  125. }
  126. discrete();
  127. solve(1,Q,0,num);b[0]=-1;
  128. rep(1,cc,i)put(b[ans[i]]);
  129. return 0;
  130. }

我收回之前说的话 这个东西难写+难调 写+调了2h才搞出来 细节贼多。

线段树+堆要好写多了。自闭了。

P3250 [HNOI2016]网络的更多相关文章

  1. luogu P3250 [HNOI2016]网络

    传送门 考虑只有一个询问,怎么使用暴力枚举最快的得到答案.因为要求最大的,所以可以把链按权值从大往小排序,然后往后扫,找到一个没有交的就是答案,直接退出 一堆询问,可以考虑整体二分,先二分一个值\(m ...

  2. 洛咕P3250 [HNOI2016]网络 整体二分

    这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...

  3. [洛谷P3250][HNOI2016]网络

    题目大意:给定一棵树.有三种操作: $0\;u\;v\;t:$在$u$到$v$的链上进行重要度为$t$的数据传输. $1\;x:$结束第$x$个数据传输. $2\;x:$询问不经过点$x$的数据传输中 ...

  4. 洛谷P3250 [HNOI2016]网络(整体二分+树状数组+树剖)

    传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$m ...

  5. 并不对劲的bzoj4538:loj2049:p3250:[HNOI2016]网络

    题意 有一棵\(n\)(\(n\leq 10^5\))个点的树,\(m\)(\(m\leq 2\times 10^5\))个操作.操作有三种:1.给出\(u,v,k\),表示加入一条从\(u\)到\( ...

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

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

  7. BZOJ 4538: [Hnoi2016]网络 [整体二分]

    4538: [Hnoi2016]网络 题意:一棵树,支持添加一条u到v权值为k的路径,删除之前的一条路径,询问不经过点x的路径的最大权值 考虑二分 整体二分最大权值,如果\(k \in [mid+1, ...

  8. 【LG3250】[HNOI2016]网络

    [LG3250][HNOI2016]网络 题面 洛谷 题解 30pts 对于\(m\leq 2000\),直接判断一下这个个点是否断掉一个交互,没断掉的里面取\(max\)即可,复杂度\(O(m^2\ ...

  9. 4538: [Hnoi2016]网络

    4538: [Hnoi2016]网络 链接 分析: 整体二分. 对于一次操作,可以二分一个答案mid,判断权值大于mid的路径是否全部经过这个点.如果是 ,那么这次询问的答案在[l,mid-1]之间, ...

随机推荐

  1. POJ 3057 Evacuation 题解

    题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...

  2. JSOI2015 Salesman(树型DP)

    [luogu6082] [题目描述] 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益 ...

  3. shell专题(九):函数

    9.1 系统函数 1.basename基本语法 basename [string / pathname] [suffix]   (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字 ...

  4. java 数据结构(三):java常用类 三 日期时间API

    JDK 8之前日期时间API 1.获取系统当前时间:System类中的currentTimeMillis()long time = System.currentTimeMillis();//返回当前时 ...

  5. 数据可视化基础专题(七):Pandas基础(六) 数据增删改以及相关操作

    首先第一部还是导入 Pandas 与 NumPy ,并且要生成一个 DataFrame ,这里小编就简单的使用随机数的形式进行生成,代码如下: import numpy as np import pa ...

  6. 数据可视化之powerBI基础(十二)PowerBI导入Excel数据有哪几种方式?

    https://zhuanlan.zhihu.com/p/64999937 Excel作为使用最频繁.应用最广泛.用户最庞大的数据处理工具,当然也应该是PowerBI最常用的数据获取方式,本文介绍一下 ...

  7. 数据可视化实例(十四):带标记的发散型棒棒糖图 (matplotlib,pandas)

    偏差 (Deviation) 带标记的发散型棒棒糖图 (Diverging Lollipop Chart with Markers) 带标记的棒棒糖图通过强调您想要引起注意的任何重要数据点并在图表中适 ...

  8. Python之 爬虫(十二)关于深度优先和广度优先

    网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据 ...

  9. 这就是Java代码生成器的制作流程

    1. 前言 前几天写了篇关于Mybatis Plus代码生成器的文章,不少同学私下问我这个代码生成器是如何运作的,为什么要用到一些模板引擎,所以今天来说明下代码生成器的流程. 2. 代码生成器的使用场 ...

  10. 题解 CF1385D 【a-Good String】

    题意 定义:字符串s 为一个c-好串(c 为一个字符)时,必须满足: 当\(|s| = 1\) ,\(s = c\) 当\(|s| > 1\), \(s\) 的左半部分为全为 \(c\),右半部 ...