【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 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数 ...
随机推荐
- Java用Gson遍历json所有节点
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</ar ...
- weblogic11,linux字符页面安装
1. 安装前 1 确定weblogic版本被认证 首先请确认您要安装的Weblogic版本所在的平台已通过了BEA的认证,完整的认证平台列表请参考http://e-docs.bea.com/wls ...
- 关于scrapy下载文件重命名的办法以及对应url没有文件后缀的办法
https://www.jianshu.com/p/d1bb28cbb6a8 scrapy中负责下载文件的是class MyFilesPipeline(FilesPipeline)类 其中负责下载文件 ...
- shell 获取随机字符串
一直使用 /dev/urandom 和md5sum的方式去随机字符串,感觉还是不够随机,毕竟只有小写字母和数字嘛. 换换口味: [root@localhost ~]# arr=(`echo {a..z ...
- rman备份例子
1.全备份例子 #!/bin/sh RMAN_OUTPUT_LOG=/home/oracle/rman_output.logRMAN_ERROR_LOG=/home/oracle/rman_error ...
- python简说(二十三)发邮件
import yagmailusername='uitestp4p@163.com'password='houyafan123'#生成授权码,qq.163.126都是授权码 mail_server = ...
- 【python40--类和对象:一些相关的BIF】
0.如何判断一个类是否为另外一个类的子类 --使用issubclass(class,classinfo)函数,如果第一个函数(class)是第二个参数(classinfo)的一个子类,则返回Ture, ...
- Eclipse的Servers视图中无法添加Tomcat
问题:Eclipse的Servers视图中无法添加Tomcat,其中ServerName是被置为灰色的,无法编辑,如下图所示: 解决步骤: 关闭Eclipse 找到Eclipse的工作区间,这里假设命 ...
- Shiro源码分析
1.入口类:AbstractAuthenticator 用户输入的登录信息经过其authenticate方法: public final AuthenticationInfo authenticate ...
- [转]抓取当前登录用户登录密码的工具:mimipenguin
Github项目地址 前有Mimikatz,今有mimipenguin,近日国外安全研究员huntergregal发布了工具mimipenguin,一款Linux下的密码抓取神器,可以说弥补了Linu ...