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,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这 ...
随机推荐
- h5内容初探
h5简介: h5新特性 h5新增标签 article 和 section 的区别相当于 div 和 p标签的区别 1—6都是块级元素 h5新增属性 拖放 拖动事件 <style> ...
- SPSS-判别分析
判别分析 判别分析是一种有效的对个案进行分类分析的方法.和聚类分析不同的是,判别分析时组别的特征已知. 定义:判别分析先根据已知类别的事物的性质,利用某种技术建立函数式,然后对未知类别的新事物进 行判 ...
- JDK8中JVM堆内存划分
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...
- Vue-axios快速上手(转)
引入方式: 1 2 3 4 5 $ npm install axios $ cnpm install axios //taobao源 $ bower install axios 或者使用cdn: &l ...
- python--第一天总结
[变量]1.变量定义的规则: 变量名只能是 字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 以下关键字不能声明为变量名 ['and', 'as', 'assert', ' ...
- 牛客网练习赛12---A and B
A题传送门:https://www.nowcoder.net/acm/contest/68/A B题传送门: https://www.nowcoder.net/acm/contest/68/B A ...
- 190. Reverse Bits (Int; Bit)
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- 对话框 AlterDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("尊敬的用户"); bu ...
- ActiveMQ之HelloWorld
JMS实现JMS接口的消息中间件 Provider:生产者 Consumer:消费者 PTP:Point to Point:点对点的消息模型 Pub/Sub:Publish/Subscribe:发布订 ...
- jquery--blur()事件,在页面加载时自动获取焦点
jquery--blur()事件会在页面加载时自动获取焦点,应将onblur写到html标签中 <div class="inputbox"> <input typ ...