【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 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数 ...
随机推荐
- AtCoder Beginner Contest 084(AB)
A - New Year 题目链接:https://abc084.contest.atcoder.jp/tasks/abc084_a Time limit : 2sec / Memory limit ...
- 为什么要使用yocto
作为灵活多变且经济高效的解决方案,嵌入式 Linux展现了巨大的价值,并广泛应用于消费电子设备.网络设备.零售点和行业应用程序.然而,广泛的应用也意味着多样化的业务需求,嵌入式解决方案开发人员必须构建 ...
- xtrabackup 对pxc节点进行备份恢复
xtrabackup 对pxc节点进行备份恢复 全量备份一个节点的数据,当节点挂掉时,使用备份恢复到最近状态,再启动节点加入集群. 备份 xtrabackup 命令小解释: --defaults-fi ...
- Golang错误处理函数defer、panic、recover、errors.New介绍
在默认情况下,当发生错误(panic)后,程序就会终止运行 如果发生错误后,可以捕获错误,并通知管理人员(邮件或者短信),程序还可以继续运行,这当然无可厚非 errors.New("错误信息 ...
- TCP 之 RST 原因分析
5. 往一个对端已经关闭的套接字上写入数据会收到一个RST信号 1.发送端的 发送缓冲区还有数据,但接收端tcp的接收通道已关闭 2. SYN到达某端口但此端口上没有正在监听的服务器.对于UDP,当一 ...
- netstat -ano输出中的ESTABLISHED off
今天,我们性能测试的环境出现个奇怪现象,通过oci direct load回库的进程似乎僵死了,应用端cpu 200%(两个线程在跑,一个是一直在ocidirectload没反应,另外一个是正在sem ...
- 01:jQuery的下拉选select2插件用法
1.1 select2插件基本使用 1.下载select2插件 1. 下载地址:https://github.com/select2/select2 2.官网地址:https://select2.or ...
- MongoDB入门一
一.环境配置 1.下载MongoDB,找到Bin目录下所有的.exe文件,拷贝到G盘MongoDB(新建)下,在MongoDB下建一个data文件,用于存放数据,创建一个logs文件夹,文件夹下创建一 ...
- kali linux fuzz工具集简述
模糊测试是一种自动化软件测试技术,涉及提供无效,意外或随机数据作为计算机程序的输入. 然后监视程序是否存在异常,例如崩溃,内置代码断言失败或潜在的内存泄漏. 通常,模糊器用于测试采用结构化输入的程序. ...
- Loader
1.定义 可以把Loader当做一个占位符,即占有屏幕的某一个空间,当加载了组件之后,这个空间就能显示相应的图形了.所以可以给Loader设置anchor布局 2.加载组件 source:加载QML文 ...