正题

luogu 2173


题目大意

给你一个图,每条边有有一种颜色(numcolor⩽10num_{color}\leqslant 10numcolor​⩽10),保证以下性质:

1.一个点连出的同色边数不大于2
2.不存在同色边组成的环

现在让你进行3钟操作:

1.修改一个点的权值
2.把两个点的连边换色(如果不存在这条边,或修改后违背上文的性质,那么不修改)
3.输出某一颜色中,一条路径上的最大值


解题思路

如果只有单颜色,那么可以用LCT维护一棵树,所有操作都可以在LCT上进行

因为numcolor⩽10num_{color}\leqslant 10numcolor​⩽10,所以多颜色建多几棵LCT即可


代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 10100
using namespace std;
int n, m, q, x, y, z, p, cn;
struct LCT
{int v[N], s[N], p[N], fa[N], deg[N], son[N][2];#define ls son[x][0]#define rs son[x][1]bool NR(int x){return fa[x] && (son[fa[x]][0] == x || son[fa[x]][1] == x);}bool IRS(int x){return son[fa[x]][1] == x;}void push_up(int x){s[x] = max(v[x], max(s[ls], s[rs]));return;}void pushr(int x){swap(ls, rs);p[x] ^= 1;return;}void push_down(int x){if (p[x]){if (ls) pushr(ls);if (rs) pushr(rs);p[x] = 0;}return;}void push_hall(int x){if (NR(x)) push_hall(fa[x]);push_down(x);return;}void rotate(int x){int y = fa[x], z = fa[y], k = IRS(x), g = son[x][!k];if (NR(y)) son[z][IRS(y)] = x;if (g) fa[g] = y;fa[x] = z;fa[y] = x;son[x][!k] = y;son[y][k] = g;push_up(y);return;}void Splay(int x){push_hall(x);while(NR(x)){if (NR(fa[x])){if (IRS(x) == IRS(fa[x])) rotate(fa[x]);else rotate(x);}rotate(x);}push_up(x);return;}void access(int x){for (int y = 0; x; y = x, x = fa[x])Splay(x), rs = y, push_up(x);}void make_root(int x){access(x);Splay(x);pushr(x);return;}int find_root(int x){access(x);Splay(x);while(ls) push_down(x), x = ls;Splay(x);return x;}void Split(int x, int y){make_root(x);access(y);Splay(y);return;}void link(int x, int y){deg[x]++;deg[y]++;make_root(x);if (find_root(y) != x) fa[x] = y;return;}bool cut(int x, int y){make_root(x);if (find_root(y) == x && fa[y] == x && !son[y][0]){deg[x]--;deg[y]--;fa[y] = son[x][1] = 0;push_up(x);return true;}return false;}
}T[15];//建多棵树
int main()
{scanf("%d%d%d%d", &n, &m, &cn, &q);for (int i = 1; i <= n; ++i){scanf("%d", &T[0].v[i]);for (int j = 1; j < cn; ++j)T[j].v[i] = T[0].v[i];}for (int i = 1; i <= m; ++i){scanf("%d%d%d", &x, &y, &z);T[z].link(x, y);}while(q--){scanf("%d", &x);if (x == 0){scanf("%d%d", &x, &y);for (int i = 0; i <= cn; ++i)//每种颜色的树都要修改{T[i].Splay(x);T[i].v[x] = y;T[i].push_up(x);}}else if (x == 1){scanf("%d%d%d", &x, &y, &z);p = -1;for (int i = 0; i < cn; ++i){if (T[i].cut(x, y))//看是否有这样一条边,如果有就先割掉{p = i;break;}}if (p == -1)//没有连边{puts("No such edge.");continue;}if (T[z].deg[x] == 2 || T[z].deg[y] == 2)//超度数{T[p].link(x, y);//连回去puts("Error 1.");continue;}T[z].make_root(x);if (T[z].find_root(y) == x)//已经连通了,再连就会产生环{T[p].link(x, y);puts("Error 2.");continue;}T[z].link(x, y);puts("Success.");}else if (x == 2){scanf("%d%d%d", &z, &x, &y);T[z].make_root(x);if (T[z].find_root(y) != x) puts("-1");else printf("%d\n", T[z].s[x]);}}return 0;
}

【LCT】网络(luogu 2173/ZJOI2011)相关推荐

  1. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  2. 2019年二月刷题列表

    Preface 虽然二月剩下没多少了,但是为了勉强保持格式还是写一写吧 这个月的首要目标就是在剩下的时间里让这个月的做题数争取达到\(50\),不过感觉希望渺茫啊 初三中考百天倒计时要来了,所以为此我 ...

  3. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)

    题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...

  4. 【LCT】大融合(luogu 4219)

    正题 luogu 4219 题目大意 给你一棵树(初始都无连边),让你进行以下操作: 1.连接两个点 2.查询一条边被多少条路径经过 解题思路 因为有边的修改,可以用LCT来维护这棵树 一条边的经过次 ...

  5. 【LCT】城市旅行(luogu 4842/金牌导航 LCT-3)

    正题 luogu 4842 金牌导航 LCT-3 题目大意 给你一棵树,让你进行一些操作: 1.删除一条边 2.连接一条边 3.给一条路径上的点加上x 4.给出一条路径,在该路径选取两个点,求这两个点 ...

  6. 【LCT】弹飞绵羊(luogu 3203/金牌导航 LCT-2)

    正题 luogu 3203 金牌导航 LCT-2 题目大意 给你n个格子,当你在第i个格子时,可以往后跳aia_iai​格,让你进行几下操作: 1.修改第i个数 2.查询在第i个格子跳多少下会跳出界 ...

  7. 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)

    正题 luogu CF1137F 题目大意 定义一棵树的产出序列为依次删除权值最小的叶子节点的顺序 进行q此操作: 1.把一个点的权值改为当前树中的最大权值+1 2.查询一个点在删除序列中的位置 3. ...

  8. 【线段树】【LCT】【LCA】树点涂色(luogu 3703)

    树点涂色 luogu 3703 题目大意 给出一棵树,每个节点的初始颜色不同,做若干操作: 1.在一个点到根节点路径上染上一种新的颜色 2.查询一条路径上有多少种不同的颜色 3.查询一个点x,使该点到 ...

  9. 【LCT】Tree II(luogu 1501)

    Tree II luogu 1501 题目大意 给出一棵树,让你进行若干操作,操作如下: 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开,连上另一条边 4.查 ...

最新文章

  1. c语言编程题餐饮服务打分,求详细分析C语言题餐饮服务质量调查打分题和答案..._质量员考试_帮考网...
  2. Too many open files错误与解决方法
  3. R-C3D 视频活动检测的经典算法
  4. SAP 电商云 Spartacus UI 的 feature module 设计原理
  5. 域用户和计算机上解锁用户的账户,AD域账户锁定时间
  6. 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
  7. OutLook 2010 (Bata) 中的邮件导出功能
  8. context创建过程解析(一)之deployDescriptors
  9. 是的,解禁了,是胜利还是嘲讽?
  10. 你看,那个人好像一条狗哎
  11. IE6 PNG 透明
  12. 还不知道事务消息吗?这篇文章带你全面扫盲!
  13. HTML第6章简答题3(制作北大青鸟网站的中心开班信息模板)
  14. 超市条码扫描枪使用前如何进行参数设置
  15. c语言scanf用法例子,scanf(scanf用法举例)
  16. bilibili助手C2C服务器,Bilibili助手
  17. mysql中怎样把字段名改为中文_mysql修改字段名-Mysql,修改
  18. Axure中移动的绝对位置
  19. 基于微博平台的python爬虫数据采集
  20. 港股招股书“失效”无需过度解读 专业人士:不影响IPO进程

热门文章

  1. python中merge函数怎么用_Python Merge函数原理及用法解析
  2. linux提升权限命令提示符,win10如何直接使用命令提示符提高管理员权限?
  3. 卖shell看站什么意思_粤语俚语卖咸鸭蛋是什么意思?
  4. krc 编辑 linux,Linux网络编程
  5. mysql 8 配置参数优化_mysql8 参考手册--配置非持久性优化器统计参数
  6. 机器学习之数据预处理——特征编码(标签编码,独热编码)
  7. [SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole
  8. [Java基础]TreeSet集合概述和特点
  9. [蓝桥杯2019初赛]数列求值-模拟+数论
  10. apache poi斜边框线_如何使用Apache POI在Excel单元格内画斜线(Java)