博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
阅读量:4954 次
发布时间: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

你可能感兴趣的文章
独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
查看>>
网站文章如何能自动判定是抄袭?一种算法和实践架构剖析
查看>>
【OpenCV学习】滚动条
查看>>
ofo用科技引领行业进入4.0时代 用户粘性连续8个月远甩摩拜
查看>>
兰州青年志愿者“中西合璧”玩快闪 温暖旅客回家路
查看>>
计划10年建10万廉价屋 新西兰政府:比想象中难
查看>>
甘肃发首版《3D打印职业教育教材》:校企合作育专才
查看>>
为找好心人抚养孩子 浙江一离婚父亲将幼童丢弃公园
查看>>
晚婚晚育 近20年巴西35岁以上孕妇增加65%
查看>>
读书:为了那个美妙的咔哒声
查看>>
jsp改造之sitemesh注意事项
查看>>
iOS 9.0之后NSString encode方法替换
查看>>
ASMFD (ASM Filter Driver) Support on OS Platforms (Certification Matrix). (文档 ID 2034681.1)
查看>>
CRM Transaction处理中的权限控制
查看>>
[转]linux创建链接文件的两种方法
查看>>
python ipaddress模块使用
查看>>
文件权限
查看>>
busybox里的僵尸进程为何那么多
查看>>
python debug
查看>>
java 连接数据库之一个完整的函数
查看>>