BZOJ2816:[ZJOI2012]网络——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2816
https://www.luogu.org/problemnew/show/P2173
有一个无向图G,每个点有个权值,每条边有一个颜色。这个无向图满足以下两个条件:
对于任意节点连出去的边中,相同颜色的边不超过两条。
图中不存在同色的环,同色的环指相同颜色的边构成的环。
在这个图上,你要支持以下三种操作:
修改一个节点的权值。
修改一条边的颜色。
查询由颜色c的边构成的图中,所有可能在节点u到节点v之间的简单路径上的节点的权值的最大值。
这题只要知道什么数据结构,就暴力大模拟即可。
那显然给你的每种颜色组成的图形是一条链,所以使用LCT。
然后对每种颜色建LCT即可。
(纯码农题没有板子情况下1.5h写完1A,这速度怕不是药丸?)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int N=1e5+;
const int C=;
int n,m,c,k,r,fa[C][N],tr[C][N][],d[C][N];
int rev[C][N],q[N],key[N],val[C][N],head[N],cnt=-;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
inline bool get(int x,int w){
return tr[w][fa[w][x]][]==x;
}
inline bool isroot(int x,int w){
if(!fa[w][x])return ;
return tr[w][fa[w][x]][]!=x&&tr[w][fa[w][x]][]!=x;
}
inline void pushrev(int x,int w){
if(!rev[w][x])return;
swap(tr[w][x][],tr[w][x][]);
if(tr[w][x][])rev[w][tr[w][x][]]^=;
if(tr[w][x][])rev[w][tr[w][x][]]^=;
rev[w][x]=;
}
inline void upt(int x,int w){
val[w][x]=key[x];
if(tr[w][x][])val[w][x]=max(val[w][x],val[w][tr[w][x][]]);
if(tr[w][x][])val[w][x]=max(val[w][x],val[w][tr[w][x][]]);
}
inline void rotate(int x,int w){
int y=fa[w][x],z=fa[w][y],which=get(x,w);
if(z&&!isroot(y,w))tr[w][z][tr[w][z][]==y]=x;
tr[w][y][which]=tr[w][x][which^];fa[w][tr[w][y][which]]=y;
fa[w][y]=x;tr[w][x][which^]=y;fa[w][x]=z;
upt(y,w);upt(x,w);
}
inline void splay(int x,int w){
q[r=]=x;
for(int y=x;!isroot(y,w);y=fa[w][y])q[++r]=fa[w][y];
for(int i=r;i>=;i--)pushrev(q[i],w);
while(!isroot(x,w)){
if(!isroot(fa[w][x],w))
rotate(get(x,w)==get(fa[w][x],w)?fa[w][x]:x,w);
rotate(x,w);
}
upt(x,w);
}
inline void access(int x,int w){
for(int y=;x;y=x,x=fa[w][x]){
splay(x,w);tr[w][x][]=y;
if(y)fa[w][y]=x;
}
}
inline int findroot(int x,int w){
access(x,w);splay(x,w);
while(pushrev(x,w),tr[w][x][])x=tr[w][x][];
splay(x,w);
return x;
}
inline void makeroot(int x,int w){
access(x,w);splay(x,w);
rev[w][x]^=;
}
inline void split(int x,int y,int w){
makeroot(x,w);
access(y,w);splay(y,w);
}
inline void link(int x,int y,int w){
d[w][x]++;d[w][y]++;
makeroot(x,w);
fa[w][x]=y;
}
inline bool cut(int x,int y,int w){
split(x,y,w);
if(tr[w][x][]||tr[w][x][]||fa[w][x]!=y||tr[w][y][get(x,w)^])return ;
d[w][x]--;d[w][y]--;
tr[w][y][]=;fa[w][x]=;
return ;
}
int main(){
memset(head,-,sizeof(head));
n=read(),m=read(),c=read(),k=read();
for(int i=;i<=n;i++)key[i]=read();
for(int i=;i<=m;i++){
int u=read(),v=read(),w=read();
link(u,v,w);
}
for(int i=;i<=k;i++){
int op=read();
if(op==){
int x=read(),y=read();
key[x]=y;
for(int j=;j<=c;j++){
access(x,j);splay(x,j);
upt(x,j);
}
}
if(op==){
int u=read(),v=read(),w=read();
int ok=-;
for(int j=;j<=c&&ok==-;j++){
if(cut(u,v,j))ok=j;
}
if(ok==-){
puts("No such edge.");
continue;
}
if(d[w][u]>||d[w][v]>){
puts("Error 1.");
link(u,v,ok);
continue;
}
if(findroot(u,w)==findroot(v,w)){
puts("Error 2.");
link(u,v,ok);
continue;
}
puts("Success.");
link(u,v,w);
}
if(op==){
int w=read(),u=read(),v=read();
split(u,v,w);
if(findroot(u,w)!=findroot(v,w)){
puts("-1");
continue;
}
split(u,v,w);
printf("%d\n",val[w][v]);
}
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ2816:[ZJOI2012]网络——题解的更多相关文章
- ZJOI2012网络 题解报告【LCT】
题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这 ...
- [bzoj2816][ZJOI2012]网络(LCT,splay)
传送门 题解 话说以前还真没见过用LCT只维护一条链的……好像除了树点涂色那题…… 先看一下题目规定的两个性质 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜 ...
- bzoj2816 [ZJOI2012]网络
Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf 正解:$link-cut \ tree$. $LCT$板子题,直接维护 ...
- bzoj千题计划223:bzoj2816: [ZJOI2012]网络
http://www.lydsy.com/JudgeOnline/problem.php?id=2816 每种颜色搞一个LCT 判断u v之间有边直接相连: 如果u和v之间有边相连,那么他们的深度相差 ...
- BZOJ2816:[ZJOI2012]网络(LCT)
Description 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构 ...
- 洛谷 P2173 [ZJOI2012]网络 解题报告
P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...
- bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816 题面: http://www.lydsy.com/JudgeOnline/upload ...
- 【刷题】BZOJ 2816 [ZJOI2012]网络
Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf Solution 维护树上联通块的信息,支持动态加边删边 LCT 总共 ...
- 洛谷P2173 [ZJOI2012]网络(10棵lct与瞎jb暴力)
有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
随机推荐
- SpringBoot学习:获取yml和properties配置文件的内容
项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @Configu ...
- #3.14 Piday#我的圆周率日
本文来自网易云社区 作者:马宝 圆周率日(Pi day) 2011年国际数学协会正式宣布,将每年的3月14日设为国际数学节,来源则是中国古代数学家祖冲之的圆周率."终极"圆周率日是 ...
- 理解Python的装饰器
看Flask文档时候看到关于cache的装饰器,有这么一段代码: def cached(timeout=5 * 60, key=’view/%s’): def decorator(f): @wraps ...
- 『Python Kivy』Kivy模板语言KV说明
语言概念 KV语言允许你以声明的方式创建控件树,以及绑定控件属性到其他的控件或使用一种自然的方式进行回调. 它允许非常快速并灵活的改变你的UI. 它还可以让你的应用程序与应用程序的界面进行分隔. 如何 ...
- Selenium(Python)调用pywin32上传图片
import unittestfrom time import sleep import osfrom selenium import webdriverimport win32apiimport w ...
- div布局方案整理
实际项目开发过程中遇到页面 DIV 左右布局的需求:左侧 DIV 固定宽度,右侧 DIV 自适应宽度,填充满剩余页面,由此引申出本文的几种解决方案 1 左侧 DIV 设置 float 属性为 left ...
- Unity编辑器 - DragAndDrop拖拽控件
Unity编辑器 - DragAndDrop拖拽控件 Unity编辑器的拖拽(DragAndDrop)在网上能找到的资料少,自己稍微研究了一下,写了个相对完整的案例,效果如下 代码: object d ...
- 【system.file】使用说明
对象:system.file 说明:提供一系列针对文件操作的方法. 注意:参数中的filePath 均为相对网站根目录路径 目录: 方法 返回 说明 system.file.exists(filePa ...
- 基础的表ADT -数据结构(C语言实现)
读数据结构与算法分析 表的概述 形如A1,A2,A3... 操作合集 PrintList MakeEmpty Find Insert Delete 表的简单数组实现 分析: PrintList和Fin ...
- Open MPI集群运行
部署完之后,代码也能正确跑起来了,也确实集群分散了.跑一下各种各样的代码,发现了一个错误: $ ~/OpenMpi/bin/mpiexec -np ~/NetWorkTest My rank is M ...