您的位置:首页 > 产品设计 > UI/UE

[hdu4010]: Query on The Trees

2016-03-04 18:52 351 查看
  大概是有史以来调LCT调得最惨的一次了。。因为删边那里判断是否合法时少了个条件。。调了整个晚上>_<。。。。

  被模版题教做人了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: