题目链接: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]网络的更多相关文章

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

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

  2. bzoj 4538: [Hnoi2016]网络

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服 ...

  3. 4538: [Hnoi2016]网络

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

    vue-resource是一个非常轻量的用于处理HTTP请求的插件,它提供了两种方式来处理HTTP请求: 使用Vue.http或this.$http: 使用Vue.resource或this.$res ...

  2. 听 Fabien Potencier 谈Symfony2 之 《What is Symfony2 ?》

    Symfoy2 是什么? PHP世界里又一广受关注的web MVC框架? Fabien Potencier 却不这么说! Fabien Potencier这样定义Symfoy2 是个什么东西: 首先, ...

  3. 前端框架VUE----补充

    修饰符 .lazy 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 .你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步: <!-- ...

  4. 自写Jquery插件 Tab

    原创文章,转载请注明出处,谢谢!https://www.cnblogs.com/GaoAnLee/p/9067017.html 每每看到别人写的Jquery插件,自己也试着学习尝试,终有结果,废话不多 ...

  5. Server Library [Apache Tomcat 7.0] unbound解决方案

    问题描述: 当在MyEclipse中导入高版本Eclipse的[Eclipse Dynamic Web]项目后,会发现其Java Build Path(选定项目->Alt+Enter即可打开Pr ...

  6. Docker学习笔记之保存和共享镜像

    0x00 概述 让 Docker 引以为傲的是它能够实现相比于其他虚拟化软件更快的环境迁移和部署,在这件事情上,轻量级的容器和镜像结构的设计无疑发挥了巨大的作用.通过将容器打包成镜像,再利用体积远小于 ...

  7. direct加载之ora-39782一例

    近日,我们有个环境在数据加载到oracle的时候出现ora-39782异常,版本是11.2.经google,几乎没有什么先例,因为我们是使用oci直接写的,可见现在还使用oci接口并不多,也或者我们的 ...

  8. jackson JsonPropertyOrder和@JsonIgnoreProperties注解

    有些时候,我们在和外部系统交互的时候使用了json作为标准的数据交换格式,同时为了安全性考虑,增加了对报文的校验,因此我们需要确保序列化的时候参数有序且不多不少刚好,因为对外的API不像后台和前端交互 ...

  9. Vue 基础精讲

    Vue 基础精讲 Vue 官方文档:https://cn.vuejs.org/v2/guide/ VUE 实例 每个组件都是一个 vue 的实例. 一个 vue 项目是由实例组成的. vue 实例上有 ...

  10. JavaScript中字符串的方法:charAt()、charCodeAt()、indexOf()、lastIndexOf()、substr()、slice()、substring()、search()、replace()、split()、concat()、toLowerCase()、toUpperCase()

    1.字符创的创建: //1.通过new 来创建 var str = String("javascript"); //2.3.直接使用字面量进行创建 var str='html5'; ...