题目链接

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. 添加动态输出 Adding Dynamic Output 精通ASP-NET-MVC-5-弗瑞曼 Listing 2-7

    ViewBag Dynamic Output

  2. linux pycharm 安装

    Ubuntu安装之python开发   什么??公司要用Ubuntu(乌班图)?不会用??怎么进行python开发??? 乌班图操作系统下载地址:http://releases.ubuntu.com/ ...

  3. ios---选择多张图片

    #import "ViewController.h" #import <CTAssetsPickerController.h> @interface ViewContr ...

  4. Intellij IDEA使用(一)项目模板类型

    概述 IDEA默认打开后,会出现欢迎页面,可以选择打开Project的方式. 对于新建的Project,一般会选择[Create New Project],对于界面中,众多的Project类型,有时候 ...

  5. Shell常用命令之printf

    printf 内容格式化输出 格式 printf [format] [输入内容] format参数 %b:打印相关内容并解释其中反斜杠"\"的特殊字符 %q:以shell引用的格式 ...

  6. 机器学习:没有免费午餐定理(No Free Lunch Theorem)

    思考 机器学习中哪个算法好?哪个算法差呢? 下面两条线,哪个更好呢? 没有免费午餐定理 如果我们不对特征空间有先验假设,则所有算法的平均表现是一样的. 假设我们的计算机只有两个存储单元,而且每个存储单 ...

  7. 使用visual studio 2013读取.mat文件

    现在有一个T.mat 文件需要在c++中处理然后以.mat 或是.txt形式返回 T.mat中存储了十个cell,每个cell中会有一个不等长的数组 1.以下是相关配置过程: 参考:http://we ...

  8. Mybatis基础(二)

    Mybatis连接池 Mybatis连接池提供了三种配置方式,配置的位置在SqlMapConfig.xml的dataSource标签中,其type属性就是配置连接池的种类.type的可取值 1.POO ...

  9. 人生需要Plan B

    天有不测风云,人有祸兮旦福.2020年,刚打开就是地狱模式! 武汉加油,中国加油! 新冠状肺炎的强传播性,让人们不得不乖乖待在家,工地开不了工,白领不能上班,农村封村,城市封小区.人们每天在一个小范围 ...

  10. DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...