【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
题目
传送门: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+缩点)(暂时弃坑)的更多相关文章
- BZOJ 2959: 长跑 [lct 双连通分量 并查集]
2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树
- BZOJ 2959 长跑 (LCT、并查集)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2959 题解 真是被这题搞得心态大崩--调了7个小时--然而并查集都能写成\(O(n^2) ...
- BZOJ 2959 长跑 (LCT+并查集)
题面:BZOJ传送门 当成有向边做的发现过不去样例,改成无向边就忘了原来的思路.. 因为成环的点一定都能取到,我们把它们压成一个新点,权值为环上所有点的权值和 这样保证了图是一颗森林 每次询问转化为, ...
- BZOJ 2959: 长跑 lct 双联通分量 并查集 splay
http://www.lydsy.com/JudgeOnline/problem.php?id=2959 用两个并查集维护双联通分量的编号和合并. #include<iostream> # ...
- (暂时弃坑)(半成品)ACM数论之旅18---反演定理 第二回 Mobius反演(莫比乌斯反演)((づ ̄3 ̄)づ天才第一步,雀。。。。)
莫比乌斯反演也是反演定理的一种 既然我们已经学了二项式反演定理 那莫比乌斯反演定理与二项式反演定理一样,不求甚解,只求会用 莫比乌斯反演长下面这个样子(=・ω・=) d|n,表示n能够整除d,也就是d ...
- (暂时弃坑)ACM数论之旅15---置换群与Polya定理(我把标题看成poi了,poipoipoi(*≧▽≦)ツ)
(挖坑...) ////////////////////////////////////////////////// 暂时弃坑 开学了,有空再写....
- BZOJ 2959: 长跑 解题报告
2959: 长跑 Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑 ...
- bzoj 2959 长跑(LCT+BCC+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2959 [题意] n个点,提供操作:连边,修改点权,查询自定义边的方向后起点a终点b能经 ...
- bzoj 2959: 长跑【LCT+并查集】
如果没有环的话直接LCT 考虑有环怎么办,如果是静态的话就tarjan了,但是这里要动态的缩环 具体是link操作的时候看一下是否成环(两点已联通),成环的话就用并查集把这条链缩到一个点,把权值加给祖 ...
随机推荐
- Linux系统在启动过程中内核文件丢失的解决方法
在/boot目录下有两个重要的文件,分别是: vmlinuz-3.10.0-123.el7.x86_64 内核文件 initamfs-3.10.0-123.el7.x86_64.img ...
- Linux:grub密码设置与修改
grub密码设置与修改 默认GRUB启动参数可以的进入单用户模式从而修改root密码,如果想要给GRUB菜单设置密码,可以修改/etc/grub.conf文件 (/boot/grub/grub.con ...
- HM编码器代码阅读(1)——介绍以及相关知识
HM是HEVC(H.265)的开源实现,可以从网上直接下载.HEVC(H.265)是新一代的视频编解码标准.本人目前研究的只是编码器部分,而且还是入门阶段!为了提高自己,边学边记,由于理解不够深入,难 ...
- HM安装和使用方法
此文为学习JVET参考了HM的安装方法,转载自岳麓吹雪大牛的博客,膜拜. 早期的HM解决方案包含了7个工程:1. TAppCommon 2. TAppDecoder 3. TAppEncoder 4. ...
- ogg高版本到低版本同步
源端ogg版本: [oracle@rac1 ogg]$ ggsci -v Oracle GoldenGate Command Interpreter for Oracle Version 11.2.1 ...
- [GitHub] git push的时候报错 fatal: unable to access 'http://github.com/xxx/xxx.git/': Recv failure: Connection reset by peer
参考了两种方法: 1. 解决fatal: unable to connect to github.com问题 http://blog.csdn.net/greenqingqingws/article/ ...
- IE只是开始!
Study is boring,but devotion make it is easy!
- fedora 27
安装 U盘安装,感谢学长的U盘 配置 安装外来软件的时候,需要输入root密码 软件 软件安装是个麻烦事儿啊 详情 [新手指南: 在 Ubuntu 和 Fedora 上安装软件包] Fedora 中文 ...
- c++ rapidjson解析多层级json
如果一个层级为data,其内部又包含一个层级status, 可以直接通过这种方式来跨级访问: rapidjson::Value& val_status = doc["data&quo ...
- Android学习笔记之Activity详解
1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...