http://www.lydsy.com/JudgeOnline/problem.php?id=2959

用两个并查集维护双联通分量的编号和合并。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
int n,m;
int fa[maxn]={},ch[maxn][]={},siz[maxn]={},val[maxn]={},rev[maxn];
int shu[maxn]={};
int sta[maxn]={},tail=;
int p[maxn]={},b[maxn]={};
inline int read(){
int x=;int f=;char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(''<=ch&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int findfa(int x){
if(p[x]==x)return x;
return p[x]=findfa(p[x]);
}
int bel(int x){
if(b[x]==x)return x;
return b[x]=bel(b[x]);
}
inline bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
inline void updata(int x){ siz[x]=siz[ch[x][]]+siz[ch[x][]]+val[x];}
inline void rotate(int x){
int y=fa[x];int fy=fa[y];
int l=ch[y][]==x?:;int r=l^;
if(!isroot(y)){
if(ch[fy][]==y)ch[fy][]=x;
else ch[fy][]=x;
}
fa[ch[x][r]]=y;fa[y]=x;fa[x]=fy;
ch[y][l]=ch[x][r]; ch[x][r]=y;
updata(y);
}
inline void pushdown(int x){
if(rev[x]){
swap(ch[x][],ch[x][]);
if(ch[x][])rev[ch[x][]]^=;
if(ch[x][])rev[ch[x][]]^=;
rev[x]=;
}
}
inline void splay(int x){
x=bel(x);fa[x]=bel(fa[x]);
int y,fy,w=x;
sta[++tail]=w;
while(!isroot(w)){
fa[w]=bel(fa[w]);sta[++tail]=fa[w];
fa[fa[w]]=bel(fa[fa[w]]);
w=fa[w];
}
while(tail)pushdown(sta[tail--]); while(!isroot(x)){
y=fa[x];fy=fa[y];
if(!isroot(y)){
if((ch[y][]==x)^(ch[fy][]==y))rotate(x);
else rotate(y);
}rotate(x);
}updata(x);
}
inline void Access(int x){
int y=;
while(x){
x=bel(x);
splay(x);ch[x][]=y;
updata(x);
y=x;x=fa[x];
}
}
inline void Reverse(int x){
Access(x);splay(x);
rev[x]^=;
}
inline void Link(int x,int y){
Reverse(x);fa[x]=y;
}
queue< int >q;
inline void Merge(int x,int y){
Reverse(y);Access(x);splay(x);
int cnt=siz[x];
q.push(x);
while(!q.empty()){
x=q.front();q.pop();
if(ch[x][])q.push(ch[x][]);
if(ch[x][])q.push(ch[x][]);
b[bel(x)]=b[bel(y)];
val[x]=siz[x]=fa[x]=ch[x][]=ch[x][]=;
}
val[y]=siz[y]=cnt;fa[y]=;
}
int main(){
//freopen("now.in","r",stdin);
n=read();m=read();;
for(int i=;i<=n;i++){val[i]=read();shu[i]=val[i];siz[i]=val[i];}
for(int i=;i<=n;i++)p[i]=i,b[i]=i;
int op,x,y,xx,yy;
for(int i=;i<=m;i++){
op=read();x=read();y=read();
if(op==){
x=bel(x);y=bel(y);
if(x!=y){
xx=findfa(x);yy=findfa(y);
if(xx==yy) Merge(x,y);
else {Link(x,y);p[xx]=yy;}
}
}
else if(op==){
xx=bel(x);
if(shu[x]!=y){
Access(xx);splay(xx);
siz[xx]+=y-shu[x];
val[xx]+=y-shu[x];
shu[x]=y;
}
}
else{
x=bel(x);y=bel(y);
if(findfa(x)!=findfa(y)){
printf("-1\n");
}
else{
Reverse(x);Access(y);splay(y);
printf("%d\n",siz[y]);
}
}
}
return ;
}

注意一下双联通分量编号的维护

BZOJ 2959: 长跑 lct 双联通分量 并查集 splay的更多相关文章

  1. BZOJ 2959: 长跑 [lct 双连通分量 并查集]

    2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树

  2. BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树

    题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...

  3. BZOJ 2959 长跑 (LCT+并查集)

    题面:BZOJ传送门 当成有向边做的发现过不去样例,改成无向边就忘了原来的思路.. 因为成环的点一定都能取到,我们把它们压成一个新点,权值为环上所有点的权值和 这样保证了图是一颗森林 每次询问转化为, ...

  4. BZOJ 2959 长跑 (LCT、并查集)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2959 题解 真是被这题搞得心态大崩--调了7个小时--然而并查集都能写成\(O(n^2) ...

  5. BZOJ 2959: 长跑 LCT_并查集_点双

    真tm恶心...... Code: #include<bits/stdc++.h> #define maxn 1000000 using namespace std; void setIO ...

  6. 【UVA10972】RevolC FaeLoN (求边双联通分量)

    题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...

  7. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  8. HDU5409---CRB and Graph 2015多校 双联通分量缩点

    题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...

  9. poj2942(双联通分量,交叉染色判二分图)

    题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...

随机推荐

  1. 【总结】前端框架:react还是vue?

    之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...

  2. JavaScript入门--慕课网学习笔记

     JAVASCRIPT—(慕课网)入门篇 我们来看看如何写入JS代码?你只需一步操作,使用<script>标签在HTML网页中插入JavaScript代码.注意, <script&g ...

  3. CodeForces 724G: Xor-matic Number of the Graph

    题目传送门:CF724G. 题意简述: 一张 \(n\) 个点的无向图,边有边权. 定义三元组 \((u,v,w)(1\le u < v\le n)\) 合法当且仅当存在从点 \(u\) 到点 ...

  4. Python标准库笔记(8) — pprint模块

    struct模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串. Python版本: 2.x & 3.x 该模块作用是完成Python数值和C语言结构体的Pyt ...

  5. linux sigaction 函数 用法释义

    使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX 标准定义的信号处 ...

  6. redhat6.5文件共享

    以下操作均需要root用户 a端: 固定nfs端口 #vi /etc/sysconfig/nfs 将里面的RQUOTAD_PORT.LOCKD_TCPPORT.LOCKD_UDPPORT.MOUNTD ...

  7. RestTemplate中文乱码问题(spring-web3.0.7版本)

    从网上找的方法: 方法一: //resttemplate乱码问题 //3.1.X以上版本使用 // restTemplate.getMessageConverters().add(0, StringH ...

  8. 转载:Google 官方应用架构的最佳实践指南 赞👍

    官方给的实践指南,很有实际的指导意义,  特别是对一些小公司,小团队,给了很好的参考意义. 原文地址: https://developer.android.com/topic/libraries/ar ...

  9. centos7 yum搭建lamp环境

    =============================================== 2018/1/14_第1次修改                       ccb_warlock == ...

  10. Python解决八皇后问题的代码【解读】

    八皇后问题 来自于西方象棋(现在叫 国际象棋,英文chess),详情可见百度百科. 在西方象棋中,有一种叫做皇后的棋子,在棋盘上,如果双方的皇后在同一行.同一列或同一斜线上,就会互相攻击. 八皇后问题 ...