Luogu 2173 [ZJOI2012]网络 - LCT
Solution
$LCT$ 直接上$QuQ$
注意$cut$ 完 需要 $d[u + c * N]--$ 再 $link$, 不然会输出Error 1的哦
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rd read()
using namespace std; const int N = 1e5 + ; int n, m, col, Q; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-' ) p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} void cmax(int &a, int b) {
if (a < b)
a = b;
} namespace LCT {
int val[N], Max[N], f[N], ch[N][], tun[N], d[N];
#define lc(x) ch[x][0]
#define rc(x) ch[x][1]
int isroot(int x) {
return rc(f[x]) != x && lc(f[x]) != x;
} int get(int x) {
return rc(f[x]) == x;
} void up(int x) {
Max[x] = val[x];
if (lc(x)) cmax(Max[x], Max[lc(x)]);
if (rc(x)) cmax(Max[x], Max[rc(x)]);
} void rev(int x) {
swap(lc(x), rc(x));
tun[x] ^= ;
} void pushdown(int x) {
if (tun[x]) {
if (lc(x)) rev(lc(x));
if (rc(x)) rev(rc(x));
tun[x] = ;
}
} void pd(int x) {
if (!isroot(x))
pd(f[x]);
pushdown(x);
} void rotate(int x) {
int old = f[x], oldf = f[old], son = ch[x][get(x) ^ ];
if (!isroot(old)) ch[oldf][get(old)] = x;
ch[x][get(x) ^ ] = old;
ch[old][get(x)] = son;
f[old] = x; f[son] = old; f[x] = oldf;
up(old); up(x);
} void splay(int x) {
pd(x);
for (; !isroot(x); rotate(x))
if (!isroot(f[x]))
rotate(get(f[x]) == get(x) ? f[x] : x);
} void access(int x) {
for (int y = ; x; y = x, x = f[x])
splay(x), ch[x][] = y, up(x);
} void mroot(int x) {
access(x); splay(x); rev(x);
} int findr(int x) {
access(x); splay(x);
while (lc(x)) pushdown(x), x = lc(x);
return x;
} void split(int x, int y) {
mroot(x); access(y); splay(y);
} int link(int x, int y) {
if (d[x] > || d[y] > )
return ;
mroot(x);
if (findr(y) == x)
return ;
f[x] = y;
return ;
} int cut(int x, int y) {
mroot(x);
if (findr(y) != x || f[x] != y || ch[x][])
return ;
f[x] = ch[y][] = ;
return ;
}
}
using namespace LCT; int main()
{
n = rd; m = rd; col = rd; Q = rd;
for (int i = ; i <= n; ++i) {
int tmp = rd;
for (int j = ; j < col; ++j)
val[i + j * n] = tmp;
}
for (int i = ; i <= m; ++i) {
int u = rd, v = rd, z = rd;
link(u + z * n, v + z * n);
d[u + z * n]++;
d[v + z * n]++;
}
for (; Q; Q--) {
int k = rd;
if (k == ) {
int u = rd, v = rd;
for (int j = ; j < col; ++j)
mroot(u + j * n), val[u + j * n] = v, up(u + j * n);
}
if (k == ) {
int u = rd, v = rd, z = rd, flag = , c;
for (int j = ; j < col && !flag; ++j) {
flag = cut(u + j * n, v + j * n);
if (flag) c = j;
}
if (!flag) {puts("No such edge."); continue;}
d[u + c * n]--; d[v + c * n]--;
flag = link(u + z * n, v + z * n);
if (flag == ) {
puts("Error 1.");
link(u + c * n, v + c * n);
d[u + c * n]++; d[v + c * n]++;
}
else if (flag == ) {
puts("Error 2.");
link(u + c * n, v + c * n);
d[u + c * n]++; d[v + c * n]++;
}
else {
puts("Success.");
d[u + z * n]++; d[v + z * n]++;
}
}
if (k == ) {
int z = rd, u = rd, v = rd;
u = u + z * n;
v = v + z * n;
mroot(u);
if (findr(v) != u) {puts("-1"); continue;}
printf("%d\n", max(Max[lc(v)], val[v]));
}
}
}
Luogu 2173 [ZJOI2012]网络 - LCT的更多相关文章
- ZJOI2012 网络——LCT相关题目
有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
- bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816 题面: http://www.lydsy.com/JudgeOnline/upload ...
- luoguP2173 [ZJOI2012]网络 LCT
链接 luogu 思路 颜色很少,开10个lct分别维护 if (Hash.count(make_pair(u, v)) && Hash[make_pair(u, v)] == col ...
- BZOJ.2816.[ZJOI2012]网络(LCT)
题目链接 BZOJ 洛谷 对每种颜色维护一个LCT,保存点之间的连接关系. 修改权值A[x]和所有Max[x]都要改: 修改边的颜色先枚举所有颜色,看是否在某种颜色中有边,然后断开.(枚举一遍就行啊 ...
- BZOJ2816:[ZJOI2012]网络(LCT)
Description 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构 ...
- Luogu P2173 [ZJOI2012]网络
题意 写的比较清楚,我就不解释了. \(\texttt{Data Range:}n\leq 10^4,m\leq 10^5,c\leq 10,k\leq 10^5\) 题解 注意到 \(c\) 的范围 ...
- 洛谷 P2173 [ZJOI2012]网络 解题报告
P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...
- [Luogu 2604] ZJOI2010 网络扩容
[Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 nam ...
- ZJOI2012网络 题解报告【LCT】
题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这 ...
随机推荐
- oracle 日志恢复数据
1:首先查找redo,如果redo有可供恢复的信息,就那redo中的信息进行恢复,此时一般在恢复时,类似如下:SQL> recover database;Media recovery compl ...
- JS----事件3
一 事件对象(event):与特定事件相关且包含有关该事件详细信息的对象通过事件可以触发event对象的元素,鼠标的位置及状态,按下的键等等event对象只在事件发生的过程中才有效非IE浏览器里的ev ...
- Excel 如何快速切换到最后一行
1.快速切换到最后一行,是ctrl+↓箭头(来源:百度) 2. http://www.office68.com/excel/22936.html 一.定位到第一个单元格 方法1: ...
- svn git 必须理解的概念
不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入“查阅过很多资料,依然掌握不好”的困境,至少我们团队是这样的. 网上的资料确实已经很多了,却没有把 ...
- CentOS 下lvm 磁盘扩容
打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这 ...
- CentOS 7系统根目录分区扩容
说明:系统版本为 Linux version 3.10.0-327.el7.x86_64 1. 查看现有磁盘信息,可以看出根分区有45G [root@DEV-CMDB-DB02 ~]# df -h F ...
- 154. Find Minimum in Rotated Sorted Array II (Array; Divide-and-Conquer)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- 安装vCenter server 6.0
注意,5.5的还可以直接把iso里的ova直接导入为模板,6.0之后的要拉到Windows下安装. 总路线 ESXI是服务器系统,用vsphere client连接,在client里新建一个虚拟机为W ...
- HDU 1542 Atlantis(线段树面积并)
描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...
- delete[] p与 delete p
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的:但是对于类对象数组,只能用 delete[].对于 new 的单个对象,只能用 del ...