【LCT】网络(luogu 2173/ZJOI2011)
正题
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)相关推荐
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 2019年二月刷题列表
Preface 虽然二月剩下没多少了,但是为了勉强保持格式还是写一写吧 这个月的首要目标就是在剩下的时间里让这个月的做题数争取达到\(50\),不过感觉希望渺茫啊 初三中考百天倒计时要来了,所以为此我 ...
- BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...
- 【LCT】大融合(luogu 4219)
正题 luogu 4219 题目大意 给你一棵树(初始都无连边),让你进行以下操作: 1.连接两个点 2.查询一条边被多少条路径经过 解题思路 因为有边的修改,可以用LCT来维护这棵树 一条边的经过次 ...
- 【LCT】城市旅行(luogu 4842/金牌导航 LCT-3)
正题 luogu 4842 金牌导航 LCT-3 题目大意 给你一棵树,让你进行一些操作: 1.删除一条边 2.连接一条边 3.给一条路径上的点加上x 4.给出一条路径,在该路径选取两个点,求这两个点 ...
- 【LCT】弹飞绵羊(luogu 3203/金牌导航 LCT-2)
正题 luogu 3203 金牌导航 LCT-2 题目大意 给你n个格子,当你在第i个格子时,可以往后跳aia_iai格,让你进行几下操作: 1.修改第i个数 2.查询在第i个格子跳多少下会跳出界 ...
- 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)
正题 luogu CF1137F 题目大意 定义一棵树的产出序列为依次删除权值最小的叶子节点的顺序 进行q此操作: 1.把一个点的权值改为当前树中的最大权值+1 2.查询一个点在删除序列中的位置 3. ...
- 【线段树】【LCT】【LCA】树点涂色(luogu 3703)
树点涂色 luogu 3703 题目大意 给出一棵树,每个节点的初始颜色不同,做若干操作: 1.在一个点到根节点路径上染上一种新的颜色 2.查询一条路径上有多少种不同的颜色 3.查询一个点x,使该点到 ...
- 【LCT】Tree II(luogu 1501)
Tree II luogu 1501 题目大意 给出一棵树,让你进行若干操作,操作如下: 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开,连上另一条边 4.查 ...
最新文章
- c语言编程题餐饮服务打分,求详细分析C语言题餐饮服务质量调查打分题和答案..._质量员考试_帮考网...
- Too many open files错误与解决方法
- R-C3D 视频活动检测的经典算法
- SAP 电商云 Spartacus UI 的 feature module 设计原理
- 域用户和计算机上解锁用户的账户,AD域账户锁定时间
- 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
- OutLook 2010 (Bata) 中的邮件导出功能
- context创建过程解析(一)之deployDescriptors
- 是的,解禁了,是胜利还是嘲讽?
- 你看,那个人好像一条狗哎
- IE6 PNG 透明
- 还不知道事务消息吗?这篇文章带你全面扫盲!
- HTML第6章简答题3(制作北大青鸟网站的中心开班信息模板)
- 超市条码扫描枪使用前如何进行参数设置
- c语言scanf用法例子,scanf(scanf用法举例)
- bilibili助手C2C服务器,Bilibili助手
- mysql中怎样把字段名改为中文_mysql修改字段名-Mysql,修改
- Axure中移动的绝对位置
- 基于微博平台的python爬虫数据采集
- 港股招股书“失效”无需过度解读 专业人士:不影响IPO进程
热门文章
- python中merge函数怎么用_Python Merge函数原理及用法解析
- linux提升权限命令提示符,win10如何直接使用命令提示符提高管理员权限?
- 卖shell看站什么意思_粤语俚语卖咸鸭蛋是什么意思?
- krc 编辑 linux,Linux网络编程
- mysql 8 配置参数优化_mysql8 参考手册--配置非持久性优化器统计参数
- 机器学习之数据预处理——特征编码(标签编码,独热编码)
- [SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole
- [Java基础]TreeSet集合概述和特点
- [蓝桥杯2019初赛]数列求值-模拟+数论
- apache poi斜边框线_如何使用Apache POI在Excel单元格内画斜线(Java)