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,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
随机推荐
- rsync同步的艺术
转自:http://roclinux.cn/?p=2643 如果你是一位运维工程师,你很可能会面对几十台.几百台甚至上千台服务器,除了批量操作外,环境同步.数据同步也是必不可少的技能. 说到“同步”, ...
- Selenium安装(二)
安装python 安装Selenium之前首先来说一下Python,python是一门动态性语言,python的编写比较灵活,简洁,开发效率高.因此以python结合selenium来进行自动化测试. ...
- 小球下落 (Dropping Balls,UVA 679)
题目描述: 题目思路: 1.直接用数组模拟二叉树下落过程 //超时 #include <iostream> #include <cstring> using namespace ...
- [2018 ACL Long] 对话系统
[NLG - E2E - knowledge guide generation] 1. Knowledge Diffusion for Neural Dialogue Generation ( Ci ...
- sql STUFF 分组
---将sql想关的数据放到一个字段里 select r.Region_Name, )) [text()] from City c2 inner join Region as r2 on c2.Reg ...
- js经典试题之闭包
js经典试题之闭包 1:以下代码输出的结果是? function Foo(){ var i=0; return function(){ document.write(i++); } } var f1= ...
- 关于LNMP常见问题和性能方面的个人理解
简单整理,自己做备忘的,不为其他作任何参考- PHP程序 1.开启慢日志,过滤超时时间为1s的方法,针对性优化,可以通过添加缓存方式解决. 2.过滤access日志,统计哪些请求较多较为频繁,是否合理 ...
- 第十七次ScrumMeeting会议
第十七次Scrum Meeting 时间:2017/12/7 地点:线上+主235 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工作 ...
- 软工网络15个人作业4-alpha阶段个人总结(201521123059 叶文柠)
一.个人总结 (1) 类别 具体技能和面试问题 现在回答 毕业找工作时 语言 最拿手的计算机语言之一,代码量多少? 感觉自己没有最拿手的语言,而且拿手的在计算机网络这方面的,所以在软件变成这方面的代码 ...
- 老生常谈-从输入url到页面展示到底发生了什么
来自:咸鱼老弟 - 博客园 链接:http://www.cnblogs.com/xianyulaodi/p/6547807.html