题面:BZOJ传送门

当成有向边做的发现过不去样例,改成无向边就忘了原来的思路..

因为成环的点一定都能取到,我们把它们压成一个新点,权值为环上所有点的权值和

这样保证了图是一颗森林

每次询问转化为,取出$a$到$b$这条链,求链上所有点的权值和

这实际是一个不删边的动态维护边双的过程

可以用$LCT$维护

加入一条边$<x,y>$时,我们取出链$x,y$

如果$x,y$原来不连通,把它们连上

否则说明$x,y$原来就联通的,连上这条边会成环,把$x,y$这条链上的点全都压成一个点,用并查集维护

每次$access$都在并查集里找父亲就行了

维护权值的时候细节比较多

 #include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 150010
#define M1 (N1<<1)
#define il inline
#define idx(X) (X-'a')
using namespace std; char str[M1];
int n,m,de;
int a[N1],r[N1]; struct Union{
int fa[N1];
int findfa(int x)
{
int pre,y=x;
if(!x) return ;
while(fa[y]!=y) y=fa[y];
while(fa[x]!=y){ pre=fa[x]; fa[x]=y; x=pre; }
return y;
}
}U;
struct LCT{
int ch[N1][],fa[N1],rev[N1],sum[N1],stk[N1],tp;
il int idf(int x){ return (ch[fa[x]][]==x)?:;}
il void pushup(int x){ sum[x]=sum[ch[x][]]+sum[ch[x][]]+a[x]; }
il int isroot(int x){ return (ch[fa[x]][]!=x&&ch[fa[x]][]!=x)?:; }
il void revers(int x){ swap(ch[x][],ch[x][]),rev[x]^=; }
il void pushdown(int x)
{
if(rev[x])
{
if(ch[x][]) revers(ch[x][]);
if(ch[x][]) revers(ch[x][]);
rev[x]^=;
}
}
il void rot(int x)
{
int y=fa[x],ff=fa[y],px=idf(x),py=idf(y);
if(!isroot(y)) ch[ff][py]=x; fa[x]=ff;
fa[ch[x][px^]]=y; ch[y][px]=ch[x][px^];
fa[y]=x; ch[x][px^]=y;
pushup(y),pushup(x);
}
void splay(int x)
{
int y=x; stk[++tp]=x;
while(!isroot(y)){stk[++tp]=fa[y],y=fa[y];}
while(tp){pushdown(stk[tp--]);}
while(!isroot(x))
{
y=fa[x];
if(isroot(y)) rot(x);
else if(idf(y)==idf(x)) rot(y),rot(x);
else rot(x),rot(x);
}
}
void access(int x)
{
for(int y=;x;y=x,fa[x]=U.findfa(fa[x]),x=fa[x])
splay(x),ch[x][]=y,pushup(x);
}
void mkroot(int x)
{
access(x);
splay(x);
revers(x);
}
int findroot(int x)
{
access(x); splay(x);
while(ch[x][]) pushdown(ch[x][]),x=ch[x][];
splay(x); return x;
}
void split(int x,int y)
{
mkroot(x);
access(y);
splay(y);
}
void dfs(int x,int root)
{
U.fa[x]=root;
if(ch[x][]) dfs(ch[x][],root);
if(ch[x][]) dfs(ch[x][],root);
}
int link(int x,int y)
{
/*if(x==4&&y==1)
de=1; */
mkroot(x); access(y); splay(y);
int f=findroot(y);
if(f==x){ //merge
dfs(f,f); a[f]=sum[f];
ch[f][]=ch[f][]=;
}else{ //link
fa[x]=y;
}
}
int query(int x,int y)
{
split(x,y);
if(findroot(y)!=x) return -;
else return sum[x];
}
}lct; int main()
{
scanf("%d%d",&n,&m);
int i,j,A,B,x,y,v,fl,ans=,id=,de;
for(i=;i<=n;i++)
scanf("%d",&a[i]), lct.sum[i]=a[i], r[i]=a[i], U.fa[i]=i;
while(m--)
{
scanf("%d%d%d",&fl,&A,&B);
if(fl==)
{
x=U.findfa(A); y=U.findfa(B);
lct.link(x,y);
}
if(fl==)
{
x=U.findfa(A); lct.splay(x);
lct.sum[x]+=B-r[A];
a[x]+=B-r[A];
r[A]=B;
}
if(fl==)
{
x=U.findfa(A); y=U.findfa(B);
printf("%d\n",lct.query(x,y));
}
}
return ;
}

BZOJ 2959 长跑 (LCT+并查集)的更多相关文章

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

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

  2. 【bzoj2959】长跑 LCT+并查集

    题目描述 某校开展了同学们喜闻乐见的阳光长跑活动.为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上熙熙攘攘,摩肩接踵,盛况空前.为了 ...

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

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

  4. BZOJ 2959: 长跑 lct 双联通分量 并查集 splay

    http://www.lydsy.com/JudgeOnline/problem.php?id=2959 用两个并查集维护双联通分量的编号和合并. #include<iostream> # ...

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

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

  6. BZOJ2959长跑——LCT+并查集(LCT动态维护边双连通分量)

    题目描述 某校开展了同学们喜闻乐见的阳光长跑活动.为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上熙熙攘攘,摩肩接踵,盛况空前. 为 ...

  7. bzoj2959: 长跑 LCT+并查集+边双联通

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2959 题解 调了半天,终于调完了. 显然题目要求是求出目前从 \(A\) 到 \(B\) 的可 ...

  8. bzoj2959: 长跑(LCT+并查集)

    题解 动态树Link-cut tree(LCT)总结 LCT常数大得真实 没有环,就是\(lct\)裸题吧 有环,我们就可以绕环转一圈,缩点 怎么搞? 当形成环时,把所有点的值全部加到一个点上,用并查 ...

  9. 【bzoj4998】星球联盟 LCT+并查集

    题目描述 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个 ...

随机推荐

  1. 洛谷——P1095 守望者的逃离

    https://www.luogu.org/problem/show?pid=1095#sub 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交 ...

  2. E - Just a Hook

    E - Just a Hook HDU 1698 思路:区间修改即可. #include<cstdio> #include<cstring> #include<iostr ...

  3. 【微信小程序】:小程序,新场景

    前言: 我们频繁进入的地方,是场景. 手机.是场景:浏览器.是场景.事实上,微信,也是场景-- 微信要做的是占领很多其它用户时间.占领很多其它应用场景.占领很多其它服务入口.这是商业本质想去垄断要做的 ...

  4. Windows 7下Git SSH 创建Key【待解决?】

    1.在桌面右键,git bash here 2.检查本机是否有ssh key设置 $ cd ~/.ssh 或cd .ssh 如果没有则提示: No such file or directory:此时需 ...

  5. ScalaChina: Scala中文社区

    给大家推荐一个很常使用心的Scala中文社区 ScalaChina地址:http://scalachina.org/ 来自社区创建者的<我为什么想做ScalaChina>: http:// ...

  6. PlayerPrefs存储Vector3等结构数据

     孙广东   2016.3.31 之前有网友询问这个问题, 当时我仅仅是 提供了一个思路, 使用json序列化.反序列化. 以下就写出两种(都是仅仅能变成字符串) 1.json的序列化.反序列化方 ...

  7. Linux中修改系统时间

    #date //显示当前日期 #date -s //设置当前时间,只有root权限才能设置,其他只能查看. #date -s 20061010 //设置成20061010,这样会把具体时间设置成空00 ...

  8. golang互斥锁和读写锁

    一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开 ...

  9. Hadoop MapReduce编程 API入门系列之网页流量版本1(二十一)

    不多说,直接上代码. 对流量原始日志进行流量统计,将不同省份的用户统计结果输出到不同文件. 代码 package zhouls.bigdata.myMapReduce.areapartition; i ...

  10. .NET使用Office Open XML导出大量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...