Description

http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf

正解:$link-cut \ tree$。

$LCT$板子题,直接维护$10$个$LCT$就行了。

注意修改颜色操作,修改后的颜色可能与之前颜色相同。

 #include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define N (10005) using namespace std; map<int,int> mp[N]; int d[N][],val[N],n,m,c,Q; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} struct Link_Cut_Tree{ int ch[N][],fa[N],sum[N],rev[N],st[N]; il int isroot(RG int x){
return ch[fa[x]][]!=x && ch[fa[x]][]!=x;
} il void pushup(RG int x){
sum[x]=max(val[x],max(sum[ch[x][]],sum[ch[x][]])); return;
} il void pushdown(RG int x){
rev[ch[x][]]^=,rev[ch[x][]]^=;
swap(ch[x][],ch[x][]),rev[x]=; return;
} il void rotate(RG int x){
RG int y=fa[x],z=fa[y],k=ch[y][]==x;
if (!isroot(y)) ch[z][ch[z][]==y]=x;
fa[x]=z,ch[y][k^]=ch[x][k],fa[ch[x][k]]=y;
ch[x][k]=y,fa[y]=x,pushup(y),pushup(x); return;
} il void splay(RG int x){
RG int top=; st[++top]=x;
for (RG int i=x;!isroot(i);i=fa[i]) st[++top]=fa[i];
for (RG int i=top;i;--i) if (rev[st[i]]) pushdown(st[i]);
while (!isroot(x)){
RG int y=fa[x],z=fa[y];
if (!isroot(y)) rotate((ch[z][]==y)^(ch[y][]==x)?x:y);
rotate(x);
}
return;
} il void access(RG int x){
RG int t=;
while (x){
splay(x),ch[x][]=t;
pushup(x),t=x,x=fa[x];
}
return;
} il void makeroot(RG int x){
access(x),splay(x),rev[x]^=; return;
} il void link(RG int x,RG int y){
makeroot(x),fa[x]=y; return;
} il void cut(RG int x,RG int y){
makeroot(x),access(y),splay(y);
ch[y][]=fa[x]=,pushup(y); return;
} il int query(RG int x,RG int y){
makeroot(x),access(y),splay(y); return sum[y];
} il int find(RG int x){
access(x),splay(x);
while (ch[x][]) x=ch[x][]; return x;
} }G[]; int main(){
#ifndef ONLINE_JUDGE
freopen("network.in","r",stdin);
freopen("network.out","w",stdout);
#endif
n=gi(),m=gi(),c=gi(),Q=gi();
for (RG int i=;i<=n;++i) val[i]=gi();
for (RG int i=,u,v,w;i<=m;++i){
u=gi(),v=gi(),w=gi(); if (u>v) swap(u,v);
G[w].link(u,v),mp[u][v]=w,++d[u][w],++d[v][w];
}
while (Q--){
RG int op=gi();
if (!op){
RG int x=gi(),y=gi();
for (RG int i=;i<c;++i) G[i].splay(x); val[x]=y;
for (RG int i=;i<c;++i) G[i].pushup(x);
} else if (op==){
RG int u=gi(),v=gi(),w=gi(),k; if (u>v) swap(u,v);
if (!mp[u].count(v)){ puts("No such edge."); continue; } k=mp[u][v];
if (k!=w && (d[u][w]>= || d[v][w]>=)) puts("Error 1.");
else if (k!=w && G[w].find(u)==G[w].find(v)) puts("Error 2."); else{
RG int k=mp[u][v]; --d[u][k],--d[v][k],++d[u][w],++d[v][w];
G[k].cut(u,v),G[w].link(u,v),mp[u][v]=w,puts("Success.");
}
} else{
RG int w=gi(),u=gi(),v=gi();
if (G[w].find(u)!=G[w].find(v)) puts("-1");
else printf("%d\n",G[w].query(u,v));
}
}
return ;
}

bzoj2816 [ZJOI2012]网络的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ2816:[ZJOI2012]网络——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2816 https://www.luogu.org/problemnew/show/P2173 有一 ...

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

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

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

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

  8. bzoj 2816: [ZJOI2012]网络(splay)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2816 [题意] 给定一个无向图,满足条件:从一个节点出发的同色边不超过2条,且不存在同 ...

  9. [ZJOI2012]网络

    嘟嘟嘟 今天复习lct,趁着还年轻多写点数据结构. 首先不得不吐槽一下,题面好长啊-- 通过观察发现,\(c \leqslant 10\).那么就可以暴力的建10棵lct. 接下来说下具体做法: 1. ...

随机推荐

  1. Hadoop科普文—常见的45个问题解答

    1.Hadoop集群可以运行的3个模式? 单机(本地)模式 伪分布式模式 全分布式模式 2.  单机(本地)模式中的注意点? 在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个 ...

  2. 通过IntelliJ IDEA忽略掉不需要提交到github的文件

    现如今,开源项目越来越多,存储容器主要有github,国内的码云.开源贡献也是衡量一个开发者是否具有足够的包容能力.技术能力的重要标准. 有些开发者没注意到这些,好心提交开源项目,配置文件也提交上去, ...

  3. bzoj 2167: 公交车站

    Description Z市交通不发达,所有公交路线覆盖的边竟然一个环也不包含,甚至该市的公交路线有可能会分为几个互不连通的块,这可真是不可思议.有一天,你突然听到一条消息,说你的M个同学被困在了Z市 ...

  4. bat执行java程序 good

    start.bat set MY_HOME=%~dp0  set JMS_BINDING_PATH=%MY_HOME%..\binds set JAVA_HOME=C:\Program Files\J ...

  5. Layer UI 模块化的用法(转)

    此文章适合入门的同学查看,之前因为项目的原因,在网上找了一套Layer UI做的后台管理系统模板,完全不懂LayUI里面的JS用法,看了官方文档和其它资料后才明白怎么去实现模块化这个例子,但是还是感觉 ...

  6. Lucene学习之二:Lucene的总体架构

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623596.html Lucene总的来说是: 一个高效的,可扩展的,全 ...

  7. 自己实现async和await

    无意当中看了一些博文,说有人想自己尝试实现基于异步操作的方法: 1)直接使用Task(不说咯,这个是微软给我们的标准实现方法). 2)必须继承INotifyCompletion接口,同时自己实现IsC ...

  8. python 需求文件requirements.txt的创建及使用

    在虚拟环境中使用pip生成: (venv) $ pip freeze >requirements.txt 当需要创建这个虚拟环境的完全副本,可以创建一个新的虚拟环境,并在其上运行以下命令: (v ...

  9. JDK自带工具keytool生成ssl证书 和 HTTPS双向认证

    创建证书(第一步) keytool -genkey -alias "baidu" -keypass "123456" -keystore "D:/ba ...

  10. window.onload和3的小游戏

    window.onload出现的原因?  我们都知道页面的代码顺序是从上往下进行加载,很多时候我们要对页面中的某一个模块进行操作,这时候我们常常使用javascript代码来进行操作.为了能够保证操作 ...