题目链接

  这次坑我的是与或的结合顺序……

  开十个LCT记录一下即可。以上。

  

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#include<map>
#define maxn 210050
#define maxc 12
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Splay{
struct Node{
int e[],fa,val,maxi,tag;
}tree[maxn];
inline int iden(int x){ return x==tree[tree[x].fa].e[]; }
inline void connect(int x,int fa,int how){ tree[x].fa=fa; tree[fa].e[how]=x; }
inline bool isroot(int x){ return x!=tree[tree[x].fa].e[]&&x!=tree[tree[x].fa].e[]; }
inline void update(int x){ tree[x].maxi=max(tree[x].val,max(tree[tree[x].e[]].maxi,tree[tree[x].e[]].maxi)); }
void reverse(int x){
swap(tree[x].e[],tree[x].e[]);
tree[x].tag^=;
}
void pushdown(int x){
if(tree[x].tag==) return;
tree[x].tag=;
if(tree[x].e[]) reverse(tree[x].e[]);
if(tree[x].e[]) reverse(tree[x].e[]);
}
void rotate(int x){
int y=tree[x].fa; int r=tree[y].fa;
int sony=iden(x); int sonr=iden(y);
tree[x].fa=r; if(!isroot(y)) tree[r].e[sonr]=x;
int b=tree[x].e[sony^];
connect(b,y,sony);
connect(y,x,sony^);
update(y);
}
inline void pushto(int x){
if(!isroot(x)) pushto(tree[x].fa);
pushdown(x);
return;
}
void splay(int x){
pushto(x);
while(!isroot(x)){
int fa=tree[x].fa;
if(!isroot(fa))
if(iden(fa)==iden(x)) rotate(fa);
else rotate(x);
rotate(x);
}
update(x);
}
inline void access(int x){
int last=;
while(x){
splay(x);
tree[x].e[]=last;
update(x);
last=x; x=tree[x].fa;
}
}
inline void makeroot(int x){
access(x);
splay(x);
reverse(x);
}
inline int findroot(int x){
access(x);
splay(x);
while(tree[x].e[]) x=tree[x].e[];
return x;
}
inline void split(int x,int y){
makeroot(x);
access(y);
splay(y);
}
inline void link(int x,int y){
split(x,y);
tree[x].fa=y;
}
inline void cut(int x,int y){
split(x,y);
if(tree[y].e[]!=x||tree[x].e[]) return;
tree[x].fa=tree[y].e[]=;
}
}s[maxc]; inline long long calc(long long x,long long y,long long n){ return x*n+y; }
map<long long,int>d; int old[maxn];
int sum[maxn][maxc]; int main(){
int n=read(),m=read(),c=read(),e=read();
for(int i=;i<=n;++i){
int x=read();
for(int j=;j<=c;++j) s[j].tree[i].val=s[j].tree[i].maxi=x;
}
for(int i=;i<=m;++i){
int from=read(),to=read(),col=read();
sum[from][col]++; sum[to][col]++;
old[i+n]=col;
if(from>to) swap(from,to);
d[calc(from,to,n)]=i+n;
s[col].link(from,i+n);
s[col].link(to,i+n);
}
for(int i=;i<=e;++i){
int opt=read();
if(opt==){
int x=read(),y=read();
for(int j=;j<=c;++j){
s[j].splay(x);
s[j].tree[x].val=y;
s[j].update(x);
}
}
else if(opt==){
int from=read(),to=read(),col=read();
if(from>to) swap(from,to);
if(d.count(calc(from,to,n))==){
printf("No such edge.\n");
continue;
}
int id=d[calc(from,to,n)];
if(col==old[id]){
printf("Success.\n");
continue;
}
if(sum[from][col]==||sum[to][col]==){
printf("Error 1.\n");
continue;
}
if(s[col].findroot(from)==s[col].findroot(to)){
printf("Error 2.\n");
continue;
}
sum[from][old[id]]--; sum[to][old[id]]--;
sum[from][col]++; sum[to][col]++;
s[old[id]].cut(from,id);
s[old[id]].cut(to,id);
old[id]=col;
s[old[id]].link(from,id);
s[old[id]].link(to,id);
printf("Success.\n");
}
else{
int col=read(),x=read(),y=read();
if(s[col].findroot(x)!=s[col].findroot(y)){
printf("-1\n");
continue;
}
s[col].split(x,y);
//printf("%d %d>>>\n",y,s[col].tree[y].val);
printf("%d\n",s[col].tree[y].maxi);
}
}
return ;
}

【Luogu】P2173网络(LCT)的更多相关文章

  1. Luogu 2173 [ZJOI2012]网络 - LCT

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

  2. Luogu P2173 [ZJOI2012]网络

    题意 写的比较清楚,我就不解释了. \(\texttt{Data Range:}n\leq 10^4,m\leq 10^5,c\leq 10,k\leq 10^5\) 题解 注意到 \(c\) 的范围 ...

  3. ZJOI2012 网络——LCT相关题目

    有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...

  4. luoguP2173 [ZJOI2012]网络 LCT

    链接 luogu 思路 颜色很少,开10个lct分别维护 if (Hash.count(make_pair(u, v)) && Hash[make_pair(u, v)] == col ...

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

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

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

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

  7. BZOJ2816:[ZJOI2012]网络(LCT)

    Description 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构 ...

  8. 【luogu P3376 网络最大流】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3376 #include <iostream> #include <cstdio> # ...

  9. Luogu P4299 首都 LCT

    既然是中文题目,这里便不给题意. 分析: 这个题的做法据说是启发式合并? 但是我不会啊…… 进入正题,LCT是怎样做掉这道题的.记得在前面的一篇<大融合>的题解中,介绍过LCT维护子树信息 ...

随机推荐

  1. Android(java)学习笔记98:如何让你的GridView不再滚动

    1. 如何让你的GridView不再滚动: GridView显示不完整的原因是因为,他的外层也套用了一个滑动的控件,这个解决办法是:重写GridView,是控制GridView不能滚动,就是写一个类继 ...

  2. 在PHP中读取二进制文件

    很多时候,数据并不是用文本的方式保存的,这就需要将二进制数据读取出来,还原成我们需要的格式.PHP在二进制处理方面也提供了强大的支持. 任务 下面以读取并分析一个PNG图像的文件头为例,讲解如何使用P ...

  3. window下安装ubuntu(ubuntu可删除)

    进入ububtu13.04的安装界面,这里我们选择了“中文(简体)”,然后单击安装: 下图是现场拍的:   出现如下图时,请根据需要选择,然后单击“继续” , 接下来会出现问你是否要连接网络,我们选择 ...

  4. sublime package control以及常用插件

    一.package Control安装 1.sublime 3 import urllib.request,os; pf = 'Package Control.sublime-package'; ip ...

  5. Apache RocketMQ 正式开源分布式事务消息

    近日,Apache RocketMQ 社区正式发布4.3版本.此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消息, ...

  6. D-bus交叉编译

    在嵌入式中如果需要Qt系统支持U盘插拔,则需要Qt支持D-bus. D-bus的交叉编译依赖expat库,此库为XML解析库. 交叉编译expat库: #./configure --host=XXX ...

  7. 通过rsync+inotify实现数据实时备份

    rsync的优点与不足 与传统的cp,scp,tar,备份方式相比,rsync具有安全性高备份迅速支持增量备份的优点,可以满足对实时性要求不高的需求,例如定期备份文件服务器数据到远端服务器,但是,当数 ...

  8. Python学习——numpy.random

    numpy.random.rand numpy.random模块作用是生成随机数,其中numpy.random.rand(d0, d1, ..., dn):生成一个[0,1)之间的随机浮点数或N维浮点 ...

  9. 第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)

    目录 手册地址: before_insert(新增之前的操作) 要实现的功能 思路 触发条件: 1. 控制器里必须要调用模型的save()方式保存数据,用insert()触发不了勾子函数的 2. 模型 ...

  10. 浅谈MapReduce工作机制

    1.MapTask工作机制 整个map阶段流程大体如上图所示.简单概述:input File通过getSplits被逻辑切分为多个split文件,通通过RecordReader(默认使用lineRec ...