[hdu4010]: Query on The Trees
2016-03-04 18:52
351 查看
大概是有史以来调LCT调得最惨的一次了。。因为删边那里判断是否合法时少了个条件。。调了整个晚上>_<。。。。
被模版题教做人了QAQ。。
View Code
被模版题教做人了QAQ。。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int maxn=300233; struct zs{ int too,pre; }e[maxn<<1];int tot,last[maxn],dl[maxn]; int ch[maxn][2],fa[maxn],mxv[maxn],v[maxn],add[maxn],st[maxn],top; bool rev[maxn]; int i,j,k,n,m,x,y,w; int ra;char rx; inline int read(){ rx=getchar(),ra=0; while(rx<'0'||rx>'9')rx=getchar(); while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra; } inline void insert(int a,int b){ e[++tot].too=b,e[tot].pre=last[a],last[a]=tot; e[++tot].too=a,e[tot].pre=last[b],last[b]=tot; } inline int max(int a,int b){return a>b?a:b;} inline bool isrt(int x){ return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x; } inline void pushdown(int x){ int l=ch[x][0],r=ch[x][1]; if(rev[x]){ swap(ch[x][0],ch[x][1]), rev[l]^=1,rev[r]^=1,rev[x]=0; } if(add[x]){ if(l)add[l]+=add[x],mxv[l]+=add[x],v[l]+=add[x]; if(r)add[r]+=add[x],mxv[r]+=add[x],v[r]+=add[x]; add[x]=0; } } inline void upd(int x){ mxv[x]=max(mxv[ch[x][0]],mxv[ch[x][1]]); if(mxv[x]<v[x])mxv[x]=v[x]; } inline void rotate(int x){ int f=fa[x],gfa=fa[f],l=ch[f][1]==x,r=l^1; if(!isrt(f))ch[gfa][ch[gfa][1]==f]=x; fa[ch[f][l]=ch[x][r]]=f,fa[fa[ch[x][r]=f]=x]=gfa, upd(f); } inline void splay(int x){ int f=x,gfa; for(st[top=1]=f;!isrt(f);)st[++top]=(f=fa[f]); while(top)pushdown(st[top--]); while(!isrt(x)){ f=fa[x],gfa=fa[f]; if(!isrt(f)) rotate(((ch[f][1]==x)^(ch[gfa][1]==f))?x:f); rotate(x); } upd(x); } inline void access(int x){ for(int rc=0;x;rc=x,x=fa[x]) splay(x),ch[x][1]=rc,upd(x); } inline void makert(int x){ access(x),splay(x),rev[x]^=1; } inline void link(int x,int y){ makert(x),fa[x]=y; } inline void cut(int x,int y){ makert(x),access(y),splay(y),fa[ch[y][0]]=0,ch[y][0]=0,upd(y); } inline int getfa(int x){ for(access(x),splay(x);ch[x][0];x=ch[x][0]); return x; } int main(){ mxv[0]=-200023333;bool first=1; while(scanf("%d",&n)==1){ if(!first) for(i=0;i<=n;i++)rev[i]=add[i]=ch[i][0]=ch[i][1]=last[i]=0; else first=0; tot=0; for(i=1;i<n;i++) x=read(),y=read(),insert(x,y); for(i=1;i<=n;i++)v[i]=mxv[i]=read(); int l=0,r=1,now;dl[1]=1;fa[1]=0; while(l<r){ now=dl[++l]; for(i=last[now];i;i=e[i].pre)if(e[i].too!=fa[now]) fa[dl[++r]=e[i].too]=now; } m=read();char id; while(m--){ for(id=getchar();id<'0'||id>'9';id=getchar()); if(id=='3')w=read(); x=read(),y=read();bool sm=(getfa(x)==getfa(y)); if(id=='1') if(sm)puts("-1"); else link(x,y); if(id=='2') if(!sm||x==y)puts("-1"); else cut(x,y); if(id=='3') if(!sm)puts("-1"); else makert(x),access(y),splay(y),add[y]+=w,mxv[y]+=w,v[y]+=w; if(id=='4') if(!sm)puts("-1"); else makert(x),access(y),splay(y),printf("%d\n",mxv[y]); } puts(""); } return 0; }
View Code
相关文章推荐
- SPOJ QTREE Query on a tree [树链剖分+线段树]
- NSOperationQueue与GCD的使用原则和场景
- Android自动化测试(UiAutomator)介绍与学习
- UGUI源码学习之初涉Button(三)
- UIBezierPath精讲
- 消息队列ActiveMQ(一)——Queue方式和Topic方式
- require 加载机制
- UGUI源码学习之初涉Text(二)
- UITableView的全选和多选功能
- EasyUI Combobox 二级联动
- HBuilder实现软件自动升级
- 利用UIWindow自定义类似UIAlertView的弹出框
- HBase requestsPerSecond到底是什么?
- UISegmentedControl 改变选中颜色
- 使用Homebrew管理你的mac开发包( Press RETURN to continue or any other key to abort)
- UITableView 总结
- iOS3D-Touch开发之Home Screen Quick Actions(Ocjective-C)
- does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), o
- 90、setStatusBarStyle无效问题 修改状态栏颜色 只有白色黑色可选UIStatusBarStyleLightContent
- 常见移动设备的 CSS3 Media Query 整理(iPhone/iPad/Galaxy)