博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
阅读量:4947 次
发布时间:2019-06-11

本文共 3256 字,大约阅读时间需要 10 分钟。

题目

 

 

分析

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

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

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

  行走的大常数noble_

 

代码

#include 
#define lc son[x][0]#define rc son[x][1]using namespace std;const int maxn=150005;int son[maxn][2],s[maxn],v[maxn],lazy[maxn],fa[maxn],st[maxn],dig[100];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])][1]==x;}inline int isroot(int x){
int f=findset(fa[x]);return !(son[f][0]==x||son[f][1]==x);}inline int rev(int x){lazy[x]^=1; swap(lc,rc);}inline void pushdown(int x){ if(!lazy[x]) return; if(lc) rev(lc); if(rc) rev(rc); lazy[x]=0;}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=0; 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=0;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=0;}inline int in(){ char c=getchar(); for (;c>'9'||c<'0';c=getchar()); int num=0; for (;c>='0'&&c<='9';c=getchar()) num=num*10+c-'0'; return num; } inline void write(int x){ if (!x) { putchar('0'); putchar('\n'); return; } dig[0]=0; while (x) { dig[++dig[0]]=x%10; x/=10; } for (int i=dig[0];i>=1;--i) putchar(dig[i]+'0'); putchar('\n');}int main(){ int n,m; n=in();m=in(); for(register int i= 1;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==1){ 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==2){ int xx=x; x=findset(x); access(x); splay(x); v[x]+=y-a[xx]; a[xx]=y; update(x); } if(p==3){ x=findset(x); y=findset(y); if(find(x)!=find(y) ){ write(-1); continue; } makeroot(x); access(y); splay(y); write(s[y]); } } return 0;}

 

 

转载于:https://www.cnblogs.com/noblex/p/9123324.html

你可能感兴趣的文章
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
python--迭代器与生成器
查看>>
SQL之case when then用法详解
查看>>
STL 排序函数
查看>>
Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络...
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>
Scrapy入门程序点评
查看>>
DotNetty网络通信框架学习之源码分析
查看>>
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
Does not contain a valid host;port authority解决方法
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>