Description

  一个简单的网络系统可以被描述成一棵无根树。每个节点为一个服务器。连接服务器与服务器的数据线则看做
一条树边。两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服务器(包括这两个服务
器自身)。由于这条路径是唯一的,当路径上的某个服务器出现故障,无法正常运行时,数据便无法交互。此外,
每个数据交互请求都有一个重要度,越重要的请求显然需要得到越高的优先处理权。现在,你作为一个网络系统的
管理员,要监控整个系统的运行状态。系统的运行也是很简单的,在每一个时刻,只有可能出现下列三种事件中的
一种:1.  在某两个服务器之间出现一条新的数据交互请求;2.  某个数据交互结束请求;3.  某个服务器出现故
障。系统会在任何故障发生后立即修复。也就是在出现故障的时刻之后,这个服务器依然是正常的。但在服务器产
生故障时依然会对需要经过该服务器的数据交互请求造成影响。你的任务是在每次出现故障时,维护未被影响的请
求中重要度的最大值。注意,如果一个数据交互请求已经结束,则不将其纳入未被影响的请求范围。

Input

  第一行两个正整数n,m,分别描述服务器和事件个数。服务器编号是从1开始的,因此n个服务器的编号依次是1
,2,3,…,n。接下来n-1行,每行两个正整数u,v,描述一条树边。u和v是服务器的编号。接下来m行,按发生时刻依
次描述每一个事件;即第i行(i=1,2,3,…,m)描述时刻i发生的事件。每行的第一个数type描述事件类型,共3种
类型:(1)若type=0,之后有三个正整数a,b,v,表示服务器a,b之间出现一条重要度为v的数据交互请求;(2)
若type=1,之后有一个正整数t,表示时刻t(也就是第t个发生的事件)出现的数据交互请求结束;(3)若type=2
,之后有一个正整数x,表示服务器x在这一时刻出现了故障。对于每个type为2的事件,就是一次询问,即询问“
当服务器x发生故障时,未被影响的请求中重要度的最大值是多少?”注意可能有某个服务器自身与自身进行数据
交互的情况。2 ≤ n ≤ 10^5, 1 ≤ m ≤ 2×10^5,其他的所有输入值不超过 10^9

Output

  对于每个type=2的事件,即服务器出现故障的事件,输出一行一个整数,描述未被影响的请求中重要度的最大
值。如果此时没有任何请求,或者所有请求均被影响,则输出-1。

Sample Input

13 23
1 2
1 3
2 4
2 5
3 6
3 7
4 8
4 9
6 10
6 11
7 12
7 13
2 1
0 8 13 3
0 9 12 5
2 9
2 8
2 2
0 10 12 1
2 2
1 3
2 7
2 1
0 9 5 6
2 4
2 5
1 7
0 9 12 4
0 10 5 7
2 1
2 4
2 12
1 2
2 5
2 3

Sample Output

-1
3
5
-1
1
-1
1
1
3
6
7
7
4
6

HINT

样例给出的树如下所示:

解释其中的部分询问;下面的解释中用(a,b;t,v)表示在t时刻出现的服务器a和b之间的重

要度为v的请求:

对于第一个询问(在时刻1),此时没有任何请求,输出-1。

对于第四个询问(在时刻6),此时有两条交互(8,13;2,3),(9,12;3,5),所有询问均经过2

号服务器,输出-1。

对于第五个询问(在时刻8),此时有三条交互(8,13;2,3),(9,12;3,5),(10,12;7,1),只有交互

(10,12;7,1)没有经过2号服务器,因此输出其重要度1。

对于最后一个询问(在时刻23),此时有三条交互(9,5;12,6),(9,12;16,4),(10,5;17,7)。当3

号服务器出现故障时,只有交互(9,5;12,6)没有经过3号服务器,因此输出6。

2016.5.20新加数据一组,未重测

Source

今天翻lych博客的时候惊讶的发现他是用线段树套堆AC的;

于是我想起了寒假的时候好不容易打出来却MLE的悲剧,于是赶快再写了一遍;

具体做法就是,我们对线段树的每个节点开一个堆,如果他是询问经过该点的,那么我们把路径上的节点的堆中插入v,

然而这个题是问的不经过该点的,那么我们把这条路径的补集区间的堆中加入v即可,每个节点的堆维护的是不经过该区间的值;

(因为链剖是log个区间,所以补集也是log个区间)

那么查询相当于就是单点查询了,要及时和当层的堆去Max,因为这相当于是某种标记永久化;

有一个优化:

1.不用删除堆,在全局开一个bj数组即可,可以省一半;

2.把链剖的size[y]>size[son[x]]改为“>="

  1. // MADE BY QT666
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<cstring>
  7. #include<queue>
  8. #define lson x<<1
  9. #define rson x<<1|1
  10. using namespace std;
  11. typedef long long ll;
  12. const int N=100005;
  13. int head[N],nxt[N<<1],to[N<<1],cnt,n,m,tot;
  14. int size[N],son[N],dfn[N],tt,top[N],fa[N],deep[N];
  15. bool vis[N<<1];
  16. void lnk(int x,int y){
  17. to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
  18. to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
  19. }
  20. struct data{
  21. int x,y;
  22. };
  23. bool operator <(data u,data v){return u.x<v.x;}
  24. priority_queue<data> tr[N*4];
  25. int Top(int x){
  26. while(!tr[x].empty()&&vis[tr[x].top().y]) tr[x].pop();
  27. if(tr[x].empty()) return -1;
  28. else return tr[x].top().x;
  29. }
  30. void dfs1(int x,int f){
  31. size[x]=1;deep[x]=deep[f]+1;
  32. for(int i=head[x];i;i=nxt[i]){
  33. int y=to[i];if(y==f) continue;
  34. dfs1(y,x);fa[y]=x;size[x]+=size[y];
  35. if(size[y]>=size[son[x]]) son[x]=y;
  36. }
  37. }
  38. void dfs2(int x,int f){
  39. top[x]=f;dfn[x]=++tt;
  40. if(son[x]) dfs2(son[x],f);
  41. for(int i=head[x];i;i=nxt[i]){
  42. int y=to[i];if(y==fa[x]||y==son[x]) continue;
  43. dfs2(y,y);
  44. }
  45. }
  46. struct Data{
  47. int l,r;
  48. }q[105];
  49. bool cmp(const Data &a,const Data &b){return a.l<b.l;}
  50. void Lca(int x,int y){
  51. tot=0;
  52. while(top[x]!=top[y]){
  53. if(deep[top[x]]<deep[top[y]]) swap(x,y);
  54. q[++tot]=(Data){dfn[top[x]],dfn[x]};
  55. x=fa[top[x]];
  56. }
  57. if(deep[x]<deep[y]) swap(x,y);
  58. q[++tot]=(Data){dfn[y],dfn[x]};
  59. }
  60. void update(int x,int l,int r,int xl,int xr,int t,int v){
  61. if(xl>xr) return;
  62. if(xl<=l&&r<=xr){tr[x].push((data){v,t});return;}
  63. int mid=(l+r)>>1;
  64. if(xr<=mid) update(lson,l,mid,xl,xr,t,v);
  65. else if(xl>mid) update(rson,mid+1,r,xl,xr,t,v);
  66. else update(lson,l,mid,xl,mid,t,v),update(rson,mid+1,r,mid+1,xr,t,v);
  67. }
  68. void Change(int a,int b,int v,int t){
  69. Lca(a,b);sort(q+1,q+1+tot,cmp);
  70. update(1,1,n,1,q[1].l-1,t,v);
  71. update(1,1,n,q[tot].r+1,n,t,v);
  72. for(int i=2;i<=tot;i++) update(1,1,n,q[i-1].r+1,q[i].l-1,t,v);
  73. }
  74. int query(int x,int l,int r,int id){
  75. if(l==r){return Top(x);}
  76. int mid=(l+r)>>1;int tag=Top(x);
  77. if(id<=mid) return max(tag,query(lson,l,mid,id));
  78. else return max(tag,query(rson,mid+1,r,id));
  79. }
  80. int main(){
  81. scanf("%d%d",&n,&m);
  82. for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);lnk(x,y);}
  83. dfs1(1,0);dfs2(1,1);int t=0;
  84. while(m--){
  85. int type;scanf("%d",&type);t++;
  86. if(type==0){
  87. int a,b,v;scanf("%d%d%d",&a,&b,&v);
  88. Change(a,b,v,t);
  89. }
  90. else if(type==1){
  91. int t;scanf("%d",&t);vis[t]=1;
  92. }
  93. else {
  94. int x;scanf("%d",&x);printf("%d\n",query(1,1,n,dfn[x]));
  95. }
  96. }
  97. return 0;
  98. }

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

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

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

  2. 4538: [Hnoi2016]网络

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

  3. 【bzoj】4538: [Hnoi2016]网络

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4538 维护一个数据结构支持对于一颗树的操作,需要支持: 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. java 之 建造者模式(大话设计模式)

    建造者模式,在笔者看来比较试用于,定制一个业务流程,而流程的细节又不尽相同,每个细节又必不可少,这时应考虑使用建造者模式. 大话设计模式-类图 先看下笔者写的一个简单的例子. /** * 所有建造过程 ...

  2. SaltStack 部署案例 02

    远程执行 salt '*' state.sls apache '*':代表所有主机 state.sls :是一个模块 apache : 状态 ,表示需要部署的内容,后缀.sls YAML:三板斧 1. ...

  3. Numpy数组对象的操作-索引机制、切片和迭代方法

    前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法.使用索引和切片的方法选择元素,还有如何数组的迭代方法. 一.索引机制 1.一维数组 In [1]: a = np.arange ...

  4. [WPF]本地化入门

    1. 前言 WPF的本地化是个很常见的功能,我做过的WPF程序大部分都实现了本地化(不管最终有没有用到).通常本地化有以下几点需求: 在程序启动时根据CultureInfo.CurrentUICult ...

  5. CMMI-4中19个PA的大致描述

    组织过程资产库下面有组织级标准过程库, 这个库里一共有19各PA(就是标准过程啦) PA的英文是Process Area       CM(配置管理过程,英文是Configuration Manage ...

  6. liunx

    一键安装地址:https://lnmp.org/install.html

  7. JAVA中静态修饰符static的学习(初学)

    静态修饰符static,用于修饰类中的成员变量和成员函数. 用static修饰的成员变量也可叫做类变量. 什么时候使用静态 什么时候定义静态成员变量?     当对象中出现共享数据时,将该数据定义为静 ...

  8. JMeter接口测试系列-关联参数

    这里主要记录一下A接口的返回结果经过md5加密之后作为另外B接口的参数,这个问题困扰了很久,找了不少资料,现在把解决方法记录如下: 环境 ①JMeter 3.0 ②前置条件:将fastjson.jar ...

  9. Python爬虫(十三)_案例:使用XPath的爬虫

    本篇是使用XPath的案例,更多内容请参考:Python学习指南 案例:使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子且将该帖子里每个楼层发布的图片下载 ...

  10. Struts框架的国际化

    本文将通过一个详细的实例来展示Struts框架的国际化,使用的版本号是struts1.1. 案例:在一个页面上有一个下拉框,下拉框中有3个国家的语言选项,各自是"中文简体".&qu ...