题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4538


维护一个数据结构支持对于一颗树的操作,需要支持:

1.对于树上的一条路径上的每个点上放一个值。

2.撤销某次操作的路劲放。

3.查询除了经过这个点的路径的最大值。


往一个路径上丢值相当于往不经过条路径的所有点上丢值。

用一个树链剖分即可维护,对于操作区间取反。

直接查询单点最大值即可。

为了维护单点最大值,线段树中的每一个点对应两个堆,用于维护插入誉删除。

防止爆空间,所以标记永久化即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstring>
  8. #include<queue>
  9. using namespace std;
  10. #define maxn 400100
  11. #define llg int
  12. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  13. llg n,m,tail,deep[maxn],top[maxn],size[maxn],son[maxn],dad[maxn],id[maxn],dfsn,T,type;
  14. vector<llg>a[maxn];
  15.  
  16. struct node
  17. {
  18. priority_queue<llg>q1,q2;
  19.  
  20. void push1(llg x){ q1.push(x);}
  21. void push2(llg x){ q2.push(x);}
  22.  
  23. llg top()
  24. {
  25. llg anss=-;
  26. while (!q2.empty() && (q2.top()==q1.top())) q1.pop(),q2.pop();
  27. if (!q1.empty()) anss=q1.top();
  28. return anss;
  29. }
  30. }val[maxn*];
  31.  
  32. struct data
  33. {
  34. llg l,r;
  35. }dl[maxn];
  36.  
  37. struct data_
  38. {
  39. llg x,y,z;
  40. }ask[maxn];
  41.  
  42. bool cmp(const data&a,const data&b) {return a.l<b.l;}
  43.  
  44. void init()
  45. {
  46. llg x,y;
  47. cin>>n>>m;
  48. for (llg i=;i<n;i++)
  49. {
  50. scanf("%d%d",&x,&y);
  51. a[x].push_back(y),a[y].push_back(x);
  52. }
  53. }
  54.  
  55. void dfs_1(llg x,llg fa)
  56. {
  57. size[x]=;
  58. llg w=a[x].size(),v;
  59. for (llg i=;i<w;i++)
  60. {
  61. v=a[x][i];
  62. if (v==fa) continue;
  63. deep[v]=deep[x]+;
  64. dfs_1(v,x);
  65. dad[v]=x; size[x]+=size[v];
  66. if (size[v]>size[son[x]]) son[x]=v;
  67. }
  68. }
  69.  
  70. void dfs_2(llg x,llg fa)
  71. {
  72. id[x]=++dfsn;
  73. if (son[x]) {top[son[x]]=top[x]; dfs_2(son[x],x);}
  74. llg w=a[x].size(),v;
  75. for (llg i=;i<w;i++)
  76. {
  77. v=a[x][i];
  78. if (v==fa || v==son[x]) continue;
  79. top[v]=v; dfs_2(v,x);
  80. }
  81. }
  82.  
  83. void add(llg o,llg l,llg r,llg L,llg R,llg V)
  84. {
  85. if (l>=L && r<=R)
  86. {
  87. if (T) val[o].push1(V);
  88. else val[o].push2(V);
  89. return ;
  90. }
  91. llg lc=o<<,rc=o<<|,mid=(l+r)>>;
  92. if (L<=mid) add(lc,l,mid,L,R,V);
  93. if (R>mid) add(rc,mid+,r,L,R,V);
  94. }
  95.  
  96. void solve(llg x,llg y,llg V)
  97. {
  98. llg f1=top[x],f2=top[y];
  99. tail=;
  100. while (f1!=f2)
  101. {
  102. if (deep[f1]<deep[f2]) swap(x,y),swap(f1,f2);
  103. dl[++tail].l=id[f1]; dl[tail].r=id[x];
  104. x=dad[f1]; f1=top[x];
  105. }
  106. if (deep[x]<deep[y]) swap(x,y);
  107. dl[++tail].l=id[y],dl[tail].r=id[x];
  108. sort(dl+,dl+tail+,cmp);
  109. llg l=,r,last=;
  110. for (llg i=;i<=tail;i++)
  111. {
  112. l=last+; r=dl[i].l-;
  113. if (l<=r) add(,,n,l,r,V);
  114. last=dl[i].r;
  115. }
  116. l=last+; r=n;
  117. if (l<=r) add(,,n,l,r,V);
  118. }
  119.  
  120. llg maxl_(llg o,llg l,llg r,llg wz)
  121. {
  122. llg ans=val[o].top();
  123. if (l==r) return ans;
  124. llg mid=(l+r)>>,lc=o<<,rc=o<<|;
  125. if (wz<=mid) ans=max(ans,maxl_(lc,l,mid,wz));
  126. if (wz>mid) ans=max(ans,maxl_(rc,mid+,r,wz));
  127. return ans;
  128. }
  129.  
  130. int main()
  131. {
  132. yyj("a");
  133. init();
  134. dfs_1(,-);
  135. top[]=;
  136. dfs_2(,-);
  137. for (llg o=;o<=m;o++)
  138. {
  139. scanf("%d",&type);
  140. if (type==)
  141. {
  142. scanf("%d%d%d",&ask[o].x,&ask[o].y,&ask[o].z);
  143. T=;
  144. solve(ask[o].x,ask[o].y,ask[o].z);
  145. }
  146. if (type==)
  147. {
  148. llg x;
  149. scanf("%d",&x);
  150. T=;
  151. solve(ask[x].x,ask[x].y,ask[x].z);
  152. }
  153. if (type==)
  154. {
  155. llg x;
  156. scanf("%d",&x);
  157. printf("%d\n",maxl_(,,n,id[x]));
  158. }
  159. }
  160. return ;
  161. }

【bzoj】4538: [Hnoi2016]网络的更多相关文章

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

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

  2. bzoj 4538: [Hnoi2016]网络

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服 ...

  3. 4538: [Hnoi2016]网络

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

  4. 【LG3250】[HNOI2016]网络

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

  5. [HNOI2016]网络 树链剖分,堆

    [HNOI2016]网络 LG传送门 表示乱搞比正解难想. 整体二分很好想吧. 但是为了好写快乐,我们选择三个\(\log\)的乱搞. 先树剖,线段树套堆维护区间最大值.对于一次修改,如果是插入,就把 ...

  6. 【BZOJ4538】[Hnoi2016]网络 整体二分+树状数组

    [BZOJ4538][Hnoi2016]网络 Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互 ...

  7. Luogu-3250 [HNOI2016]网络

    Luogu-3250 [HNOI2016]网络 题面 Luogu-3250 题解 CDQ分治...这个应该算是整体二分吧 二分重要度,按照时间从小到大加入大于重要度的边 对于一个询问,如果经过这个点的 ...

  8. 网络(bzoj 4538)

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服 ...

  9. (BZOJ4538)HNOI2016 网络

    HNOI2016 Day1 T2 网络 Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数 ...

随机推荐

  1. 计蒜客---N的-2进制表示

    对于十进制整数N,试求其-2进制表示. 例如,因为  1*1  +  1*-2  +  1*4  +  0*-8  +1*16  +  1*-32  =  -13  ,所以(-13)_10  =  ( ...

  2. 51Nod 1433 0和5

    小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数.使得这个数尽可能大,而且可以被90整除. 注意: 1.这个数没有前 ...

  3. python URLError,HTTPError 的异常处理

    URLError,HTTPError 的异常处理 1. URLErrorURLError产生的原因1). 网络无连接2). 连接不到特定的服务器3). 服务器不存在 # 例子 import urlli ...

  4. IDEA添加作者和时间信息

  5. ltp-ddt的makefile结构

    顶层makefile COMMON_TARGETS        := pan utils COMMON_TARGETS    += tools testcases/ddt COMMON_TARGET ...

  6. Tsung压力测试工具安装使用

    工具安装 1)unixODBC ./configure; make; make install 或者yum安装 2)ncurses-devel ./configure; make; make inst ...

  7. List,Set,Collection,Collections比较

    官方话 1.List和Set都是接口,他们都继承于接口Collection,List是一个有序的可重复的集合,而Set的无序的不可重复的集合.Collection是集合的顶层接口,Collection ...

  8. GitHub git 命令思维导图

    GitHub git 命令思维导图 拖动图片至浏览器地址栏松手,点击回车看高清大图.

  9. 【面试篇】必须掌握的Spring 常用注解

    注解本身没有功能的,就和 xml 一样.注解和 xml 都是一种元数据,元数据即解释数据的数据,这就是所谓配置. 本文主要罗列 Spring|Spring MVC相关注解的简介. Spring部分 1 ...

  10. (2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署

    基于<神经网络和深度学习>这本绝好的教材提供的相关资料和代码,我们自己动手编写"随机取样的梯度下降神经网络".为了更好地说明问题,我们先从简单的开始: 1.sigmod ...