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,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
随机推荐
- meta-data获取小结
android 开发中: 在AndroidManifest.xml中,<meta-data>元素可以作为子元素, 被包含在<activity>.<applicat ...
- 「日常温习」Hungary算法解决二分图相关问题
前言 二分图的重点在于建模.以下的题目大家可以清晰的看出来这一点.代码相似度很高,但是思路基本上是各不相同. 题目 HDU 1179 Ollivanders: Makers of Fine Wands ...
- hdu1045Fire Net(经典dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- liunx环境下安装禅道
环境: vm12.5.2 CentOS-7-x86_64 ZenTaoPMS.9.1.stable.zbox_64 SecureCRT 8.0 因为liunx环境下配置apache, php, mys ...
- ReadyAPI创建功能测试的方法
声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 在ReadyAPI中有多种方法可以创建功能测试,本篇将分步操作创建功能测试. 1.从So ...
- [CF294B]Shaass and Bookshelf
问题描述 Shaass拥有n本书.他想为他的所有书制作一个书架,并想让书架的长宽尽量小.第i本书的厚度是t[i],且这本书的纸张宽度是w[i].书的厚度是1或2,所有书都有同样的高度(即书架的高是均匀 ...
- 理解 JavaScript 原型 / 原型链
关于对象 以下代码中 p 的值是一个新对象,里面拥有 name 和 age 属性 function People(name, age){ this.name = name this.age = age ...
- 【第五章】MySQL数据库的安全机制
MySQL权限表MySQL用户管理MySQL权限管理SSL加密连接
- Tensorflow中使用tfrecord方式读取数据-深度学习-周振洋
本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释.并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正. 使用Tensorflow训练神经网络时,我们可以用 ...
- scatter注记词2
couch ranch bind ski extra bring note embrace tape they stick legend