【bzoj】4538: [Hnoi2016]网络
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4538
维护一个数据结构支持对于一颗树的操作,需要支持:
1.对于树上的一条路径上的每个点上放一个值。
2.撤销某次操作的路劲放。
3.查询除了经过这个点的路径的最大值。
往一个路径上丢值相当于往不经过条路径的所有点上丢值。
用一个树链剖分即可维护,对于操作区间取反。
直接查询单点最大值即可。
为了维护单点最大值,线段树中的每一个点对应两个堆,用于维护插入誉删除。
防止爆空间,所以标记永久化即可。
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<vector>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<queue>
- using namespace std;
- #define maxn 400100
- #define llg int
- #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
- llg n,m,tail,deep[maxn],top[maxn],size[maxn],son[maxn],dad[maxn],id[maxn],dfsn,T,type;
- vector<llg>a[maxn];
- struct node
- {
- priority_queue<llg>q1,q2;
- void push1(llg x){ q1.push(x);}
- void push2(llg x){ q2.push(x);}
- llg top()
- {
- llg anss=-;
- while (!q2.empty() && (q2.top()==q1.top())) q1.pop(),q2.pop();
- if (!q1.empty()) anss=q1.top();
- return anss;
- }
- }val[maxn*];
- struct data
- {
- llg l,r;
- }dl[maxn];
- struct data_
- {
- llg x,y,z;
- }ask[maxn];
- bool cmp(const data&a,const data&b) {return a.l<b.l;}
- void init()
- {
- llg x,y;
- cin>>n>>m;
- for (llg i=;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- a[x].push_back(y),a[y].push_back(x);
- }
- }
- void dfs_1(llg x,llg fa)
- {
- size[x]=;
- llg w=a[x].size(),v;
- for (llg i=;i<w;i++)
- {
- v=a[x][i];
- if (v==fa) continue;
- deep[v]=deep[x]+;
- dfs_1(v,x);
- dad[v]=x; size[x]+=size[v];
- if (size[v]>size[son[x]]) son[x]=v;
- }
- }
- void dfs_2(llg x,llg fa)
- {
- id[x]=++dfsn;
- if (son[x]) {top[son[x]]=top[x]; dfs_2(son[x],x);}
- llg w=a[x].size(),v;
- for (llg i=;i<w;i++)
- {
- v=a[x][i];
- if (v==fa || v==son[x]) continue;
- top[v]=v; dfs_2(v,x);
- }
- }
- void add(llg o,llg l,llg r,llg L,llg R,llg V)
- {
- if (l>=L && r<=R)
- {
- if (T) val[o].push1(V);
- else val[o].push2(V);
- return ;
- }
- llg lc=o<<,rc=o<<|,mid=(l+r)>>;
- if (L<=mid) add(lc,l,mid,L,R,V);
- if (R>mid) add(rc,mid+,r,L,R,V);
- }
- void solve(llg x,llg y,llg V)
- {
- llg f1=top[x],f2=top[y];
- tail=;
- while (f1!=f2)
- {
- if (deep[f1]<deep[f2]) swap(x,y),swap(f1,f2);
- dl[++tail].l=id[f1]; dl[tail].r=id[x];
- x=dad[f1]; f1=top[x];
- }
- if (deep[x]<deep[y]) swap(x,y);
- dl[++tail].l=id[y],dl[tail].r=id[x];
- sort(dl+,dl+tail+,cmp);
- llg l=,r,last=;
- for (llg i=;i<=tail;i++)
- {
- l=last+; r=dl[i].l-;
- if (l<=r) add(,,n,l,r,V);
- last=dl[i].r;
- }
- l=last+; r=n;
- if (l<=r) add(,,n,l,r,V);
- }
- llg maxl_(llg o,llg l,llg r,llg wz)
- {
- llg ans=val[o].top();
- if (l==r) return ans;
- llg mid=(l+r)>>,lc=o<<,rc=o<<|;
- if (wz<=mid) ans=max(ans,maxl_(lc,l,mid,wz));
- if (wz>mid) ans=max(ans,maxl_(rc,mid+,r,wz));
- return ans;
- }
- int main()
- {
- yyj("a");
- init();
- dfs_1(,-);
- top[]=;
- dfs_2(,-);
- for (llg o=;o<=m;o++)
- {
- scanf("%d",&type);
- if (type==)
- {
- scanf("%d%d%d",&ask[o].x,&ask[o].y,&ask[o].z);
- T=;
- solve(ask[o].x,ask[o].y,ask[o].z);
- }
- if (type==)
- {
- llg x;
- scanf("%d",&x);
- T=;
- solve(ask[x].x,ask[x].y,ask[x].z);
- }
- if (type==)
- {
- llg x;
- scanf("%d",&x);
- printf("%d\n",maxl_(,,n,id[x]));
- }
- }
- return ;
- }
【bzoj】4538: [Hnoi2016]网络的更多相关文章
- BZOJ 4538: [Hnoi2016]网络 [整体二分]
4538: [Hnoi2016]网络 题意:一棵树,支持添加一条u到v权值为k的路径,删除之前的一条路径,询问不经过点x的路径的最大权值 考虑二分 整体二分最大权值,如果\(k \in [mid+1, ...
- bzoj 4538: [Hnoi2016]网络
Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服 ...
- 4538: [Hnoi2016]网络
4538: [Hnoi2016]网络 链接 分析: 整体二分. 对于一次操作,可以二分一个答案mid,判断权值大于mid的路径是否全部经过这个点.如果是 ,那么这次询问的答案在[l,mid-1]之间, ...
- 【LG3250】[HNOI2016]网络
[LG3250][HNOI2016]网络 题面 洛谷 题解 30pts 对于\(m\leq 2000\),直接判断一下这个个点是否断掉一个交互,没断掉的里面取\(max\)即可,复杂度\(O(m^2\ ...
- [HNOI2016]网络 树链剖分,堆
[HNOI2016]网络 LG传送门 表示乱搞比正解难想. 整体二分很好想吧. 但是为了好写快乐,我们选择三个\(\log\)的乱搞. 先树剖,线段树套堆维护区间最大值.对于一次修改,如果是插入,就把 ...
- 【BZOJ4538】[Hnoi2016]网络 整体二分+树状数组
[BZOJ4538][Hnoi2016]网络 Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互 ...
- Luogu-3250 [HNOI2016]网络
Luogu-3250 [HNOI2016]网络 题面 Luogu-3250 题解 CDQ分治...这个应该算是整体二分吧 二分重要度,按照时间从小到大加入大于重要度的边 对于一个询问,如果经过这个点的 ...
- 网络(bzoj 4538)
Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服 ...
- (BZOJ4538)HNOI2016 网络
HNOI2016 Day1 T2 网络 Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数 ...
随机推荐
- 计蒜客---N的-2进制表示
对于十进制整数N,试求其-2进制表示. 例如,因为 1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13 ,所以(-13)_10 = ( ...
- 51Nod 1433 0和5
小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数.使得这个数尽可能大,而且可以被90整除. 注意: 1.这个数没有前 ...
- python URLError,HTTPError 的异常处理
URLError,HTTPError 的异常处理 1. URLErrorURLError产生的原因1). 网络无连接2). 连接不到特定的服务器3). 服务器不存在 # 例子 import urlli ...
- IDEA添加作者和时间信息
- ltp-ddt的makefile结构
顶层makefile COMMON_TARGETS := pan utils COMMON_TARGETS += tools testcases/ddt COMMON_TARGET ...
- Tsung压力测试工具安装使用
工具安装 1)unixODBC ./configure; make; make install 或者yum安装 2)ncurses-devel ./configure; make; make inst ...
- List,Set,Collection,Collections比较
官方话 1.List和Set都是接口,他们都继承于接口Collection,List是一个有序的可重复的集合,而Set的无序的不可重复的集合.Collection是集合的顶层接口,Collection ...
- GitHub git 命令思维导图
GitHub git 命令思维导图 拖动图片至浏览器地址栏松手,点击回车看高清大图.
- 【面试篇】必须掌握的Spring 常用注解
注解本身没有功能的,就和 xml 一样.注解和 xml 都是一种元数据,元数据即解释数据的数据,这就是所谓配置. 本文主要罗列 Spring|Spring MVC相关注解的简介. Spring部分 1 ...
- (2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
基于<神经网络和深度学习>这本绝好的教材提供的相关资料和代码,我们自己动手编写"随机取样的梯度下降神经网络".为了更好地说明问题,我们先从简单的开始: 1.sigmod ...