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的更多相关文章

  1. ZJOI2012 网络——LCT相关题目

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

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

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

  3. luoguP2173 [ZJOI2012]网络 LCT

    链接 luogu 思路 颜色很少,开10个lct分别维护 if (Hash.count(make_pair(u, v)) && Hash[make_pair(u, v)] == col ...

  4. BZOJ.2816.[ZJOI2012]网络(LCT)

    题目链接 BZOJ 洛谷 对每种颜色维护一个LCT,保存点之间的连接关系. 修改权值A[x]和所有Max[x]都要改: 修改边的颜色先枚举所有颜色,看是否在某种颜色中有边,然后断开.(枚举一遍就行啊 ...

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

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

  6. Luogu P2173 [ZJOI2012]网络

    题意 写的比较清楚,我就不解释了. \(\texttt{Data Range:}n\leq 10^4,m\leq 10^5,c\leq 10,k\leq 10^5\) 题解 注意到 \(c\) 的范围 ...

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

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

  8. [Luogu 2604] ZJOI2010 网络扩容

    [Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 nam ...

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

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

随机推荐

  1. MongoDB应用场景

    数据记录如下 /* 1 */ { "_id" : ObjectId("5b56dd19a171d7e9bfb03ac1"), "name" ...

  2. SPSS-非参数检验

    非参数检验(卡方(Chi-square)检验.二项分布(Binomial)检验.单样本K-S(Kolmogorov-Smirnov)检验.单样本变量值随机性检验(Runs Test).两独立样本非参数 ...

  3. WebView 加载网页返回后,jsp界面数据消失(一个斜杆引起来的风波)

    http://ip:port//interface/app/index.jsp 如果不小心就会把,port后面的//两个斜杆给忽略... 当有两个斜杆时,webview仍可以将网页,正常加载.但是数据 ...

  4. SO减单后MO分配给其他SO的问题修复

    逻辑:MO取进FP系统之前,首先判断是否带有SO号+SO行号,如果带有SO号+SO行号,则判断此SO号和SO行号是否存在订单表中,如果不存在则表示此MO对应的订单已减单,此MO需要做过滤,并展现在报表 ...

  5. 以字符串形式获取excel单元格中的内容

    public static String getCellValue(XSSFCell cell) { if (cell == null) { return ""; } switch ...

  6. sqlserver 当前时间减去30天

    参考 https://zhidao.baidu.com/question/750666819064717772.html select dateadd(dd,-30,getdate()) from 表 ...

  7. vue项目打包后图片路径问题

    当用vue-cli自动构建项目后,有两种运行方法,分别是: npm run dev : 提供一个开发的环境,自动热更新,资源使用绝对路径,所以可以正常看到背景图片. npm run build : 打 ...

  8. Python hash() 函数

    Python hash() 函数  Python 内置函数 描述 hash() 用于获取取一个对象(字符串或者数值等)的哈希值. 语法 hash 语法: hash(object) 参数说明: obje ...

  9. JavaScript各种继承方式(六):寄生组合继承

    一 原理 用寄生继承来改造组合继承. function Fruit(name){ this.name = name; } Fruit.prototype.eat = function(){ conso ...

  10. c#控件的动画显示效果

    1.  缘由: 项目中任务完成有个提示,需要以动画效果展示,其效果当如下图: 此为老项目为Delphi所写,改用c#实现,此效果做些设计.本也不难,小技而已,但为易于扩展,写了个静态类实现. 2. A ...