luogu2173 [ZJOI2012]网络
problem
给出一个无向图,每条边有一种颜色。每种颜色都构成一个森林。需要完成以下操作。
- 修改点权
- 修改边的颜色
- 询问某种颜色的森林中某条路径上点权最大值
solution
颜色数量不超过10,所以对于每种颜色建一棵LCT。
修改点权,就对每种颜色的LCT都修改。
修改边的颜色,就将原来颜色的LCT中这条边断掉,在新颜色的LCT中加上。这里需要判断加入边后是否还满足是森林,所以需要统计每个点连出去的各种颜色点的数量。还要判断是否会形成环,只要判断原来两点是否在同一棵树中。
询问操作则直接询问即可。
code
/*
* @Author: wxyww
* @Date: 2020-02-26 07:36:20
* @Last Modified time: 2020-02-26 09:21:59
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
#define ls TR[cur].ch[0]
#define rs TR[cur].ch[1]
const int N = 10010;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct LCT {
struct node {
int ch[2],val,rev,mx,pre;
}TR[N];
int isroot(int cur) {
return TR[TR[cur].pre].ch[0] != cur && TR[TR[cur].pre].ch[1] != cur;
}
int getwh(int cur) {
return TR[TR[cur].pre].ch[1] == cur;
}
void up(int cur) {
TR[cur].mx = max(TR[ls].mx,max(TR[rs].mx,TR[cur].val));
}
void pushdown(int cur) {
if(TR[cur].rev) {
TR[ls].rev ^= 1;TR[rs].rev ^= 1;
swap(ls,rs);
TR[cur].rev = 0;
}
}
void rotate(int cur) {
int fa = TR[cur].pre,gr = TR[fa].pre,f = getwh(cur);
if(!isroot(fa)) TR[gr].ch[getwh(fa)] = cur;
TR[cur].pre = gr;
if(TR[cur].ch[f ^ 1]) TR[TR[cur].ch[f ^ 1]].pre = fa;
TR[fa].ch[f] = TR[cur].ch[f ^ 1];
TR[fa].pre = cur;TR[cur].ch[f ^ 1] = fa;
up(fa);up(cur);
}
int sta[N],top;
void splay(int cur) {
sta[++top] = cur;
for(int i = cur;!isroot(i);i = TR[i].pre) {
// printf("%d\n",i);
sta[++top] = TR[i].pre;
}
while(top) pushdown(sta[top--]);
while(!isroot(cur)) {
if(!isroot(TR[cur].pre)) {
if(getwh(TR[cur].pre) == getwh(cur)) rotate(TR[cur].pre);
else rotate(cur);
}
rotate(cur);
}
}
void access(int cur) {
for(int t = 0;cur;t = cur,cur = TR[cur].pre) {
splay(cur);rs = t;up(cur);
}
}
void makeroot(int cur) {
access(cur);
splay(cur);
TR[cur].rev ^= 1;
}
void link(int x,int y) {
// printf("%d\n",x);
makeroot(x);TR[x].pre = y;
}
void cut(int x,int cur) {
makeroot(x);access(cur);
splay(cur);
ls = TR[ls].pre = 0;
up(cur);
}
void update(int cur,int c) {
makeroot(cur);TR[cur].val = c;
up(cur);
}
int find(int cur) {
access(cur);splay(cur);
while(ls) cur = ls;
return cur;
}
int query(int x,int y) {
if(find(x) != find(y)) return -1;
makeroot(x);access(y);splay(y);
return TR[y].mx;
}
}t[10];
#define pi pair<int,int>
map<pi,int>ma;
int num[N][11];
int main() {
// freopen("1.in","r",stdin);
int n = read(),m = read(),C = read(),Q = read();
for(int i = 1;i <= n;++i) {
int x = read();
for(int j = 0;j < C;++j)
t[j].TR[i].mx = t[j].TR[i].val = x;
}
for(int i = 1;i <= m;++i) {
int u = read(),v = read(),w = read();
ma[make_pair(u,v)] = ma[make_pair(v,u)] = w;
num[u][w]++;num[v][w]++;
t[w].link(u,v);
// puts("!!!");
}
while(Q--) {
int opt = read();
if(opt == 0) {
int x = read(),y = read();
for(int j = 0;j < C;++j) {
t[j].update(x,y);
}
}
if(opt == 1) {
int u = read(),v = read(),w = read();
if(!ma.count(make_pair(u,v))) {
puts("No such edge.");continue;
}
int tmp = ma[make_pair(u,v)];
if(tmp == w) {puts("Success.");continue;}
if(num[u][w] + 1 > 2 || num[v][w] + 1 > 2) {puts("Error 1.");continue;}
// printf("%d %d\n",t[w].find(u),t[w].find(v));
if(t[w].find(u) == t[w].find(v)) {
puts("Error 2.");continue;}
puts("Success.");
t[tmp].cut(u,v);
num[u][tmp]--;num[v][tmp]--;
num[u][w]++;num[v][w]++;
t[w].link(u,v);
ma[make_pair(u,v)] = ma[make_pair(v,u)] = w;
}
if(opt == 2) {
int c = read(),u = read(),v = read();
printf("%d\n",t[c].query(v,u));
}
}
return 0;
}
luogu2173 [ZJOI2012]网络的更多相关文章
- 洛谷 P2173 [ZJOI2012]网络 解题报告
P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...
- bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816 题面: http://www.lydsy.com/JudgeOnline/upload ...
- 【刷题】BZOJ 2816 [ZJOI2012]网络
Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf Solution 维护树上联通块的信息,支持动态加边删边 LCT 总共 ...
- bzoj2816 [ZJOI2012]网络
Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf 正解:$link-cut \ tree$. $LCT$板子题,直接维护 ...
- bzoj 2816: [ZJOI2012]网络(splay)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2816 [题意] 给定一个无向图,满足条件:从一个节点出发的同色边不超过2条,且不存在同 ...
- [ZJOI2012]网络
嘟嘟嘟 今天复习lct,趁着还年轻多写点数据结构. 首先不得不吐槽一下,题面好长啊-- 通过观察发现,\(c \leqslant 10\).那么就可以暴力的建10棵lct. 接下来说下具体做法: 1. ...
- BZOJ.2816.[ZJOI2012]网络(LCT)
题目链接 BZOJ 洛谷 对每种颜色维护一个LCT,保存点之间的连接关系. 修改权值A[x]和所有Max[x]都要改: 修改边的颜色先枚举所有颜色,看是否在某种颜色中有边,然后断开.(枚举一遍就行啊 ...
- Luogu 2173 [ZJOI2012]网络 - LCT
Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再 $link$, 不然会输出Error 1的哦 Code #include<cs ...
- bzoj千题计划223:bzoj2816: [ZJOI2012]网络
http://www.lydsy.com/JudgeOnline/problem.php?id=2816 每种颜色搞一个LCT 判断u v之间有边直接相连: 如果u和v之间有边相连,那么他们的深度相差 ...
随机推荐
- Docker在树莓派的安装与使用(Ubuntu Arm Server v19.10)
最近由于冠状病毒疫情的原因,只能够和小朋友家里蹲.这几天把尘封已久的那个树莓派拿出来继续捣鼓.希望能够做一个异构的分布式系统框架,于是想把Docker也安装到树莓派上,以便后期做进一步的开发和实验. ...
- 面试系列-面试官:你能给我解释一下javascript中的this吗?
一.前言 关于javascript中的this对象,可能已经被大家说烂了. 即使是这样,我依然决定将这篇文章给水出来.毕竟全国在新型肺炎的影响下,公司没法正常复工. 除了刷刷手机,还是要适当的学习一下 ...
- Windows下Charles从下载安装到证书设置和浏览器抓包
1.在Charles官网https://www.charlesproxy.com/download/下载,我这边下载的是免费体验版的. 2.安装好以后打开,配置Charles证书:选择help——SS ...
- SpringBoot学习(一):SpringBoot入门
1.Spring Boot 简介 1) 简化Spring应用开发的一个框架: 2) 整个Spring技术栈的一个大整合: 3) J2EE开发的一站式解决方案: 2.微服务 2014,martin fo ...
- mysql建立高效索引分析
一.如何建立理想的索引? 查询频繁度 区分度 索引长度 覆盖字段 1.1区分度 假设100万用户,性别基本上男/女各为50W, 区分度就低. 1.2长度小 索引长度直接影响索引文件的大小,影响增删改的 ...
- 手把手教你用C#做疫情传播仿真
手把手教你用C#做疫情传播仿真 在上篇文章中,我介绍了用C#做的疫情传播仿真程序的使用和配置,演示了其运行效果,但没有着重讲其中的代码. 今天我将抽丝剥茧,手把手分析程序的架构,以及妙趣横生的细节. ...
- 《快乐编程大本营》java语言训练班 1课:第一个java程序:你好,范冰冰;
1Java介绍 2安装java环境JDK 3安装web环境tomcat 4安装开发工具Idea2017 5编写第一个程序 ‘你好,范冰冰!’ 地址: http://code6g.com 1.Java介 ...
- Linux系统的用户和用户组管理
一.用户账户管理 Linux/Unix是一个用户.多任务的操作系统:在讲Linux账号及账户组管理之前,先简单了解一下多用户.多任务操作系统的基本概念. Linux的单用户多任务 在Linux下,当你 ...
- kubernetes从私有仓库下载遇到的坑
1.必须要在所有的k8s节点上配置私有仓库的地址.(master和node) 2.创建secret kubectl create secret docker-registry secret名字 --d ...
- C语言遇到的关于清除标准输入缓冲区的问题[编程入门]
关于标准输入缓冲区的一个易犯的小错误 之前写了个简易的登录程序,但显然这不像写Java时那么容易(只要思路对,基本没问题).一不留神就出现了小BUG! 以下是错误的源代码: #include < ...