题目

传送门:QWQ

分析

  看起来就是一个支持link的东西。

  但有环,考虑缩点......

  但疯狂Tle。大概是常数卡不过去。

  行走的大常数noble_

代码

#include <bits/stdc++.h>
#define lc son[x][0]
#define rc son[x][1]
using namespace std;
const int maxn=;
int son[maxn][],s[maxn],v[maxn],lazy[maxn],fa[maxn],st[maxn],dig[];
int pa[maxn], belong[maxn], a[maxn];
inline int findset(int x){if(belong[x]==x) return x;else return belong[x]=findset(belong[x]);}
inline int find(int x){if(pa[x]==x) return x;else return pa[x]=find(pa[x]);}
inline int ws(int x){return son[findset(fa[x])][]==x;}
inline int isroot(int x){int f=findset(fa[x]);return !(son[f][]==x||son[f][]==x);}
inline int rev(int x){lazy[x]^=; swap(lc,rc);}
inline void pushdown(int x){
if(!lazy[x]) return;
if(lc) rev(lc); if(rc) rev(rc); lazy[x]=;
}
inline void update(int x){ s[x]=s[lc]+s[rc]+v[x]; }
inline void rot(int x){
int f=fa[x], ff=fa[f],w1=ws(x),w2=ws(fa[x]),xx=son[x][!w1];
if(!isroot(f))son[ff][w2]=x;son[x][!w1]=f;son[f][w1]=xx;
if(xx)fa[xx]=f;fa[f]=x;fa[x]=ff;
update(f);update(x);
}
inline void splay(int x){
int y=x,z=; st[++z]=y; pushdown(x);
while(!isroot(y)) st[++z]=y=findset(fa[y]);
while(z) pushdown(st[z--]),fa[st[z]]=findset(fa[st[z]]);
for(;!isroot(x);rot(x))
if(ws(x)==ws(fa[x])&&!isroot(fa[x])) rot(fa[x]);
update(x);
}
inline void access(int x){
for(int y=;x;x=findset(fa[y=x])){
splay(x); rc=y; if(y) fa[y]=x; update(x);
}
}
inline void makeroot(int x){
access(x); splay(x); rev(x);
}
inline int findroot(int x){
access(x); splay(x);
while(lc) pushdown(x),x=lc;
return x;
}
inline void link(int x,int y){
makeroot(x);
if(findroot(y)==x) return;
fa[x]=y;
}
inline void merge(int x,int y){
if(!x) return;
belong[findset(x)]=findset(y); pushdown(x);
if(x!=y) v[y]+=v[x];
if(lc) merge(lc,y); if(rc) merge(rc,y);
// puts("**********************");
lc=rc=;
}
inline int in(){
char c=getchar();
for (;c>''||c<'';c=getchar());
int num=;
for (;c>=''&&c<='';c=getchar())
num=num*+c-'';
return num;
}
inline void write(int x)
{
if (!x)
{
putchar('');
putchar('\n');
return;
}
dig[]=;
while (x)
{
dig[++dig[]]=x%;
x/=;
}
for (int i=dig[];i>=;--i) putchar(dig[i]+'');
putchar('\n');
}
int main(){
int n,m; n=in();m=in();
for(register int i= ;i<=n;++i) v[i]=in(),pa[i]=belong[i]=i,a[i]=v[i];
int p,x,y;
while(m--){
p=in();x=in();y=in();
if(p==){
x=findset(x);y=findset(y);
if(x==y) continue;
int r1=find(x), r2=find(y);
if(r1!=r2){
pa[r2]=r1;
link(x,y);
}
else{
makeroot(x); access(y); splay(y);
merge(y,y); update(y);
}
}
if(p==){
int xx=x;
x=findset(x);
access(x); splay(x); v[x]+=y-a[xx]; a[xx]=y;
update(x);
}
if(p==){
x=findset(x); y=findset(y);
if(find(x)!=find(y) ){
write(-); continue;
}
makeroot(x); access(y); splay(y);
write(s[y]);
}
}
return ;
}

【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)的更多相关文章

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

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

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

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

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

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

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

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

  5. (暂时弃坑)(半成品)ACM数论之旅18---反演定理 第二回 Mobius反演(莫比乌斯反演)((づ ̄3 ̄)づ天才第一步,雀。。。。)

    莫比乌斯反演也是反演定理的一种 既然我们已经学了二项式反演定理 那莫比乌斯反演定理与二项式反演定理一样,不求甚解,只求会用 莫比乌斯反演长下面这个样子(=・ω・=) d|n,表示n能够整除d,也就是d ...

  6. (暂时弃坑)ACM数论之旅15---置换群与Polya定理(我把标题看成poi了,poipoipoi(*≧▽≦)ツ)

    (挖坑...) ////////////////////////////////////////////////// 暂时弃坑 开学了,有空再写....

  7. BZOJ 2959: 长跑 解题报告

    2959: 长跑 Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑 ...

  8. bzoj 2959 长跑(LCT+BCC+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2959 [题意] n个点,提供操作:连边,修改点权,查询自定义边的方向后起点a终点b能经 ...

  9. bzoj 2959: 长跑【LCT+并查集】

    如果没有环的话直接LCT 考虑有环怎么办,如果是静态的话就tarjan了,但是这里要动态的缩环 具体是link操作的时候看一下是否成环(两点已联通),成环的话就用并查集把这条链缩到一个点,把权值加给祖 ...

随机推荐

  1. vue.js 源代码学习笔记 ----- instance index

    import { initMixin } from './init' import { stateMixin } from './state' import { renderMixin } from ...

  2. 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  3. Jenkins简单的使用

    1.每个版本开发提单子,写清楚发布那个项目.配置文件.所执行SQL语句等:QA开始部署测试环境 2.如下时发布项目 一.版本发布 登陆系统,选择对应的项目(以api-gateway为例,如果找不到对应 ...

  4. PHP 反引号运行Shell命令,C程序

    /********************************************************************* * PHP 反引号运行Shell命令,C程序 * 说明: ...

  5. vue中axios的深入使用

    如上所示一条简单的请求数据,用到了vue中axios,promise,qs等等 这里我将vue中用到的axios进行了封装方便日后使用  先对工具类进行封装utils/axios.js: // 引入模 ...

  6. ICCS 会议 Latex 压缩文件提交主要事项

    cd papers/conf latex main... check that the are no error messages ...zip -r mypaper.zip * 说明:必须在Linu ...

  7. CF1109A Sasha and a Bit of Relax

    CF1109A Sasha and a Bit of Relax 用 \(xorsum[l,r]\) 表示 \(a[l] \oplus a[l+1] \oplus a[l+2]... a[r-1] \ ...

  8. SSZipArchive使用详解

    下载SSZipArchive,点击我.或者自己在这里下载. SSZipArchive功能: 解压zip文件 解压密码保护的zip文件 创建zip文件 追加到zip文件 压缩文件 使用一个名字来压缩NS ...

  9. A Corrupt Mayor's Performance Art

    Corrupt governors always find ways to get dirty money. Paint something, then sell the worthless pain ...

  10. python3 升级 pip9.0.1 到pip-9.0.3

    首先试试 python -m pip install --upgrade pip python3.5 升级 pip-9.0.3报错 You are using pip version 9.0.1, h ...