https://www.lydsy.com/JudgeOnline/problem.php?id=2816

https://www.luogu.org/problemnew/show/P2173

有一个无向图G,每个点有个权值,每条边有一个颜色。这个无向图满足以下两个条件:

  1. 对于任意节点连出去的边中,相同颜色的边不超过两条。

  2. 图中不存在同色的环,同色的环指相同颜色的边构成的环。

在这个图上,你要支持以下三种操作:

  1. 修改一个节点的权值。

  2. 修改一条边的颜色。

  3. 查询由颜色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]网络——题解的更多相关文章

  1. ZJOI2012网络 题解报告【LCT】

    题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这 ...

  2. [bzoj2816][ZJOI2012]网络(LCT,splay)

    传送门 题解 话说以前还真没见过用LCT只维护一条链的……好像除了树点涂色那题…… 先看一下题目规定的两个性质 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜 ...

  3. bzoj2816 [ZJOI2012]网络

    Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf 正解:$link-cut \ tree$. $LCT$板子题,直接维护 ...

  4. bzoj千题计划223:bzoj2816: [ZJOI2012]网络

    http://www.lydsy.com/JudgeOnline/problem.php?id=2816 每种颜色搞一个LCT 判断u v之间有边直接相连: 如果u和v之间有边相连,那么他们的深度相差 ...

  5. BZOJ2816:[ZJOI2012]网络(LCT)

    Description 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构 ...

  6. 洛谷 P2173 [ZJOI2012]网络 解题报告

    P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...

  7. bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816 题面: http://www.lydsy.com/JudgeOnline/upload ...

  8. 【刷题】BZOJ 2816 [ZJOI2012]网络

    Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf Solution 维护树上联通块的信息,支持动态加边删边 LCT 总共 ...

  9. 洛谷P2173 [ZJOI2012]网络(10棵lct与瞎jb暴力)

    有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...

随机推荐

  1. meta-data获取小结

    android 开发中:   在AndroidManifest.xml中,<meta-data>元素可以作为子元素,   被包含在<activity>.<applicat ...

  2. 「日常温习」Hungary算法解决二分图相关问题

    前言 二分图的重点在于建模.以下的题目大家可以清晰的看出来这一点.代码相似度很高,但是思路基本上是各不相同. 题目 HDU 1179 Ollivanders: Makers of Fine Wands ...

  3. hdu1045Fire Net(经典dfs)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. liunx环境下安装禅道

    环境: vm12.5.2 CentOS-7-x86_64 ZenTaoPMS.9.1.stable.zbox_64 SecureCRT 8.0 因为liunx环境下配置apache, php, mys ...

  5. ReadyAPI创建功能测试的方法

    声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 在ReadyAPI中有多种方法可以创建功能测试,本篇将分步操作创建功能测试. 1.从So ...

  6. [CF294B]Shaass and Bookshelf

    问题描述 Shaass拥有n本书.他想为他的所有书制作一个书架,并想让书架的长宽尽量小.第i本书的厚度是t[i],且这本书的纸张宽度是w[i].书的厚度是1或2,所有书都有同样的高度(即书架的高是均匀 ...

  7. 理解 JavaScript 原型 / 原型链

    关于对象 以下代码中 p 的值是一个新对象,里面拥有 name 和 age 属性 function People(name, age){ this.name = name this.age = age ...

  8. 【第五章】MySQL数据库的安全机制

    MySQL权限表MySQL用户管理MySQL权限管理SSL加密连接

  9. Tensorflow中使用tfrecord方式读取数据-深度学习-周振洋

    本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释.并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正. 使用Tensorflow训练神经网络时,我们可以用 ...

  10. scatter注记词2

    couch ranch bind ski extra bring note embrace tape they stick legend