经过一系列的修改,终于是打对了正确性,但是不知道为什么T了。
#include<bits/stdc++.h>
using namespace std;
struct node0
{
int h,to,quan;
}way[4000004];
struct node1
{
int left,right,num,lazy1,lazy2;
}str[8000008];
int a,b[2000002],f[2000002],g,u,v,w,s[2000002],t[2000002];
int be[2000002],dfs[2000002],rks[2000002],gs[2000002],hd[2000002],cnt;
char in[11];
inline int lft(int x)
{
return x<<1;
}
inline int iht(int x)
{
return x<<1|1;
}
inline void ndin(int x,int y,int z)
{
g++;
way[g].quan=z;
way[g].to=y;
way[g].h=f[x];
f[x]=g;
}
inline void pu(int x)
{
str[x].num=max(str[lft(x)].num,str[iht(x)].num);
}
inline void pd1(int x)
{
if(str[x].lazy1!=-1)
{
int lz=str[x].lazy1;
str[x].lazy1=-1;
str[lft(x)].lazy1=lz;
str[iht(x)].lazy1=lz;
str[lft(x)].lazy2=0;
str[iht(x)].lazy2=0;
str[lft(x)].num=lz;
str[iht(x)].num=lz;
}
}
inline void pd2(int x)
{
if(str[x].lazy2>0)
{
int lz=str[x].lazy2;
str[x].lazy2=0;
str[lft(x)].lazy2+=lz;
str[iht(x)].lazy2+=lz;
str[lft(x)].num+=lz;
str[iht(x)].num+=lz;
}
}
void makstr(int x,int lt,int rt)
{
str[x].left=lt;
str[x].right=rt;
str[x].lazy1=-1;
str[x].lazy2=0;
if(lt==rt)
{
str[x].num=b[rks[lt]];
return;
}
int me=(lt+rt)>>1;
makstr(lft(x),lt,me);
makstr(iht(x),me+1,rt);
pu(x);
}
void adstr1(int x,int lt,int rt,int y)
{
if(lt<=str[x].left&&str[x].right<=rt)
{
str[x].num=y;
str[x].lazy1=y;
str[x].lazy2=0;
return;
}
pd1(x);
pd2(x);
int me=(str[x].left+str[x].right)>>1;
if(lt<=me)
{
adstr1(lft(x),lt,rt,y);
}
if(rt>me)
{
adstr1(iht(x),lt,rt,y);
}
pu(x);
}
void adstr2(int x,int lt,int rt,int y)
{
if(lt<=str[x].left&&str[x].right<=rt)
{
str[x].num+=y;
str[x].lazy2+=y;
return;
}
pd1(x);
pd2(x);
int me=(str[x].left+str[x].right)>>1;
if(lt<=me)
{
adstr2(lft(x),lt,rt,y);
}
if(rt>me)
{
adstr2(iht(x),lt,rt,y);
}
pu(x);
}
int foudstr(int x,int lt,int rt)
{
if(lt<=str[x].left&&str[x].right<=rt)
{
return str[x].num;
}
pd1(x);
pd2(x);
int me=(str[x].left+str[x].right)>>1,rn=0;
if(lt<=me)
{
rn=max(rn,foudstr(lft(x),lt,rt));
}
if(rt>me)
{
rn=max(rn,foudstr(iht(x),lt,rt));
}
return rn;
}
void dfs_1(int x)
{
gs[x]=-1;
s[x]=1;
for(register int i=f[x];i>0;i=way[i].h)
{
int y=way[i].to;
if(t[y]<=0)
{
b[y]=way[i].quan;
t[y]=t[x]+1;
be[y]=x;
dfs_1(y);
if(gs[x]==-1||s[gs[x]]<s[y])
{
gs[x]=y;
}
}
}
return;
}
void dfs_2(int x,int y)
{
cnt++;
hd[x]=y;
dfs[x]=cnt;
rks[cnt]=x;
if(gs[x]==-1)
{
return;
}
dfs_2(gs[x],y);
for(register int i=f[x];i>0;i=way[i].h)
{
int z=way[i].to;
if(z!=be[x]&&z!=gs[x])
{
dfs_2(z,z);
}
}
return;
}
inline void add1(int x,int y,int z)
{
while(hd[x]!=hd[y])
{
if(t[hd[x]]<t[hd[y]])
{
swap(x,y);
}
adstr1(1,dfs[hd[x]],dfs[x],z);
x=be[hd[x]];
}
if(t[x]<t[y])
{
swap(x,y);
}
adstr1(1,dfs[y]+1,dfs[x],z);
}
inline void add2(int x,int y,int z)
{
while(hd[x]!=hd[y])
{
if(t[hd[x]]<t[hd[y]])
{
swap(x,y);
}
adstr2(1,dfs[hd[x]],dfs[x],z);
x=be[hd[x]];
}
if(t[x]<t[y])
{
swap(x,y);
}
adstr2(1,dfs[y]+1,dfs[x],z);
}
inline int found(int x,int y)
{
int rn=0;
while(hd[x]!=hd[y])
{
if(t[hd[x]]<t[hd[y]])
{
swap(x,y);
}
rn=max(rn,foudstr(1,dfs[hd[x]],dfs[x]));
x=be[hd[x]];
}
if(t[x]<t[y])
{
swap(x,y);
}
rn=max(rn,foudstr(1,dfs[y]+1,dfs[x]));
return rn;
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
scanf("%d",&a);
for(register int i=1;i<a;i++)
{
scanf("%d%d%d",&u,&v,&w);
ndin(u,v,w);
ndin(v,u,w);
}
t[1]=1;
dfs_1(1);
dfs_2(1,1);
makstr(1,1,cnt);
while(scanf("%s",in))
{
if(in[0]=='C'&&in[1]=='h')
{
scanf("%d%d",&u,&v);
int m=way[(u<<1)-1].to,n=way[u<<1].to;
if(be[m]==n)
{
adstr1(1,dfs[m],dfs[m],v);
}
else
{
adstr1(1,dfs[n],dfs[n],v);
}
}
if(in[0]=='C'&&in[1]=='o')
{
scanf("%d%d%d",&u,&v,&w);
add1(u,v,w);
}
if(in[0]=='A')
{
scanf("%d%d%d",&u,&v,&w);
add2(u,v,w);
}
if(in[0]=='M')
{
scanf("%d%d",&u,&v);
printf("%d\n",found(u,v));
}
if(in[0]=='S')
{
fclose(stdin);
fclose(stdout);
return 0;
}
}
}
调了至少一个小时,但是不知道是哪里出了问题。