【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 Regular Contest 077 C - pushpush
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_a Time limit : 2sec / Memory limit : 256MB Score ...
- [转载]Oracle数据库基础--SQL查询经典例题
Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用 本文使用的实例表结构与表的数据如下: emp员工表结构如下: ...
- <转>jmeter(十三)常见问题及解决方法
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- django框架基础
所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 最简单的web框架 import socket sk = socke ...
- lucene 全文检索工具的介绍
Lucene:全文检索工具:这是一种思想,使用的是C语言写出来的 1.Lucene就是apache下的一个全文检索工具,一堆的jar包,我们可以使用lucene做一个谷歌和百度一样的搜索引擎系统 2. ...
- Docker学习笔记之Copy on Write机制
0x00 概述 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新 ...
- rhel 6 version `GLIBC_2.14' not found (required by /usr/lib64/libstdc++.so.6)以及libstdc++.so.6: version GLIBCXX_3.4.18 not found解决办法
最近在oracle linux 7.3下开发了个应用,发布到rhel 6.5运行的时候,报version `GLIBC_2.14' not found (required by /usr/lib64/ ...
- spring List,Set,Map,Properties,array的配置文件注入方式
虽然不多,但是有时候在实现的时候,我们还是希望某些参数或者属性通过集合()的方式注入进来,比如配置表参数列表,addresslist,亦或是三方库等等.因为这种改动不是很多,经常一时想不起来,今天做个 ...
- 解决在ubuntu中安装或升级时出现“11:资源暂时不可用”错误
解决在ubuntu中安装或升级时出现“11:资源暂时不可用”错误 解决在ubuntu中安装或升级时出现“11:资源暂时不可用”错误. 下图为具体情况: 出现问题: termial下在执行sudo ap ...
- webstorm 安装与基本使用
1.1 webstorm 安装与配置 1.安装: https://blog.csdn.net/jiangxinyu50/article/details/79104016 2.使用: https://w ...