题目链接

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

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

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

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

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

  3. 【刷题】BZOJ 2816 [ZJOI2012]网络

    Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf Solution 维护树上联通块的信息,支持动态加边删边 LCT 总共 ...

  4. bzoj2816 [ZJOI2012]网络

    Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf 正解:$link-cut \ tree$. $LCT$板子题,直接维护 ...

  5. bzoj 2816: [ZJOI2012]网络(splay)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2816 [题意] 给定一个无向图,满足条件:从一个节点出发的同色边不超过2条,且不存在同 ...

  6. [ZJOI2012]网络

    嘟嘟嘟 今天复习lct,趁着还年轻多写点数据结构. 首先不得不吐槽一下,题面好长啊-- 通过观察发现,\(c \leqslant 10\).那么就可以暴力的建10棵lct. 接下来说下具体做法: 1. ...

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

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

  8. Luogu 2173 [ZJOI2012]网络 - LCT

    Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再  $link$,  不然会输出Error 1的哦 Code #include<cs ...

  9. bzoj千题计划223:bzoj2816: [ZJOI2012]网络

    http://www.lydsy.com/JudgeOnline/problem.php?id=2816 每种颜色搞一个LCT 判断u v之间有边直接相连: 如果u和v之间有边相连,那么他们的深度相差 ...

随机推荐

  1. Python读取字典(Dictionary)内数据的方法

    读取json后,数据类型为字典,对字典内数据的提取又有不同的方法,根据不同的字典类型 上图可以看到有”[]”,”{}” python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也 ...

  2. Shell常用命令之主机检测(ping)

    主机检测命令ping 向网络主机发送ICMP回传请求 常用选项 -A:洪水攻击选项,启用此功能能在短时间之内发送大量的ping包 -b:开启ping网桥模式,默认不允许ping网桥 -c:设置发送多少 ...

  3. jsp路径

    访问静态资源的时候${pageContext.request.Context}没有作用,在浏览器F12调试的时候发现,路径并没有被解释为项目的根路径,而是没有解释出来,还是${pageContext. ...

  4. vmware安装kvm虚拟机

    1. 概述 本篇博客主要使用运行在win10专业版上的vmware workstation 15 pro虚拟化软件,安装centos7.7最小化系统,并在centos7上安装kvm虚拟机,实现快速创建 ...

  5. 在Centos上安装docker,部署mysql数据库

    何为docker? Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 本机环境 24小时不关机的Centos ...

  6. C语言关于getchar()的小笔记

    #include <windows.h> #include <mmsystem.h> #include <string.h> void main() { int a ...

  7. python笔记18(复习)

    今日内容 复习 内容详细 1.Python入门 1.1 环境的搭建 mac系统上搭建python环境. 环境变量的作用:方便在命令行(终端)执行可执行程序,将可执行程序所在的目录添加到环境变量,那么以 ...

  8. kubernetes中node心跳处理逻辑分析

    最近在查看一个kubernetes集群中node not ready的奇怪现象,顺便阅读了一下kubernetes kube-controller-manager中管理node健康状态的组件node ...

  9. OpenGL学习网址2

    http://www.opengpu.org/forum.php?mod=viewthread&tid=7525

  10. 一个新实验:使用gRPC-Web从浏览器调用.NET gRPC服务

    今天给大家翻译一篇由ASP.NET首席开发工程师James Newton-King前几天发表的一篇博客,文中带来了一个实验性的产品gRPC-Web.大家可以点击文末的讨论帖进行相关反馈.我会在文章末尾 ...