RT,不开O2 55分,其余RE,现在感到十分迷惑,代码思路基本是跟着第一篇题解学的
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100000;
int n,m,root,MOD;
int read()
{
int t=0,w=1;
char c;
while(c<'0'||c>'9')
{
if(c=='-')
{
w=-1;
}
c=getchar();
}
while(c<='9'&&c>='0')
{
t=t*10+c-'0';
c=getchar();
}
return t*w;
}
struct Node{
int v;
int size,fatson;
int deep,id;
int fa,top;
}tr[MAXN+5];
int bk[MAXN+5];
struct Line{
int to,next;
}LL[MAXN*5+5];
int head[MAXN+5],cnt;
void addline(int x,int y)
{
LL[++cnt].to=y;
LL[cnt].next=head[x];
head[x]=cnt;
}
struct Seg{
int lv,rv,num,lz;
int l,r;
}segtr[MAXN*5+5];
int X,Y,Z;
char bz;
void dfs1(int x)
{
//cout<<x<<endl;
tr[x].size=1;
int mx=0;
for(int i=head[x];i;i=LL[i].next)
{
int y=LL[i].to;
if(y==tr[x].fa)
{
continue;
}
tr[y].fa=x;
tr[y].deep=tr[x].deep+1;
dfs1(y);
tr[x].size+=tr[y].size;
if(tr[y].size>mx)
{
mx=tr[y].size;
tr[x].fatson=y;
}
}
}
int ID;
void dfs2(int x,int top)
{
tr[x].top=top;
tr[x].id=++ID;
bk[ID]=x;
if(tr[x].fatson)
{
dfs2(tr[x].fatson,top);
}
for(int i=head[x];i;i=LL[i].next)
{
int y=LL[i].to;
if(y==tr[x].fa||y==tr[x].fatson)
{
continue;
}
dfs2(y,y);
}
}
void push_up(int o)
{
segtr[o].lv=segtr[o*2].lv;
segtr[o].rv=segtr[o*2+1].rv;
segtr[o].num=segtr[o*2].num+segtr[o*2+1].num;
if(segtr[o*2].rv==segtr[o*2+1].lv)
{
segtr[o].num--;
}
}
void build(int l,int r,int o)
{
segtr[o].l=l;segtr[o].r=r;
if(l==r)
{
segtr[o].lv=segtr[o].rv=tr[bk[l]].v;
segtr[o].num=1;
return;
}
int mid=(l+r)/2;
build(l,mid,o*2);
build(mid+1,r,o*2+1);
push_up(o);
}
void no_lz(int o)
{
if(segtr[o].lz)
{
segtr[o*2].lv=segtr[o*2].rv=segtr[o].lz;
segtr[o*2+1].lv=segtr[o*2+1].rv=segtr[o].lz;
segtr[o*2].num=segtr[o*2+1].num=1;
segtr[o*2].lz=segtr[o].lz;
segtr[o*2+1].lz=segtr[o].lz;
segtr[o].lz=0;
}
}
void add_lot(int L,int R,int v,int o)
{
if(segtr[o].l>R||segtr[o].r<L)
{
return;
}
if(segtr[o].l>=L&&segtr[o].r<=R)
{
segtr[o].lv=segtr[o].rv=segtr[o].lz=v;
segtr[o].num=1;
return;
}
no_lz(o);
add_lot(L,R,v,o*2);
add_lot(L,R,v,o*2+1);
push_up(o);
}
int Lv,Rv;
long long get_lot(int L,int R,int o)
{
if(segtr[o].l>R||segtr[o].r<L)
{
return 0;
}
if(segtr[o].l==L)
{
Lv=segtr[o].lv;
}
if(segtr[o].r==R)
{
Rv=segtr[o].rv;
}
if(segtr[o].l>=L&&segtr[o].r<=R)
{
return segtr[o].num;
}
no_lz(o);
long long a1=get_lot(L,R,o*2),a2=get_lot(L,R,o*2+1);
if(a1==0)
{
return a2;
}
else if(a2==0)
{
return a1;
}
else
{
if(segtr[o*2].rv==segtr[o*2+1].lv)
{
return a1+a2-1;
}
else
{
return a1+a2;
}
}
}
void add_road(int x,int y,int v)
{
while(tr[x].top!=tr[y].top)
{
if(tr[tr[x].top].deep<tr[tr[y].top].deep)
{
swap(x,y);
}
add_lot(tr[tr[x].top].id,tr[x].id,v,1);
x=tr[tr[x].top].fa;
}
if(tr[x].deep>tr[y].deep)
{
swap(x,y);
}
add_lot(tr[x].id,tr[y].id,v,1);
}
long long get_road(int x,int y)
{
long long ans=0;
int lvx=-1,lvy=-1;
while(tr[x].top!=tr[y].top)
{
if(tr[tr[x].top].deep<tr[tr[y].top].deep)
{
swap(x,y);swap(lvx,lvy);
}
ans+=get_lot(tr[tr[x].top].id,tr[x].id,1);
if(lvx==Rv)
{
ans--;
}
lvx=Lv;
x=tr[tr[x].top].fa;
}
if(tr[x].deep>tr[y].deep)
{
swap(x,y);swap(lvx,lvy);
}
ans+=get_lot(tr[x].id,tr[y].id,1);
if(Rv==lvy)
{
ans--;
}
if(Lv==lvx)
{
ans--;
}
return ans;
}
int main()
{
n=read();m=read();root=1;
for(int i=1;i<=n;i++)
{
tr[i].v=read();
}
for(int i=1;i<=n-1;i++)
{
X=read();Y=read();
addline(X,Y);
addline(Y,X);
}
tr[root].fa=root;
tr[root].deep=1;
dfs1(root);//cout<<m;
dfs2(root,root);
build(1,n,1);
for(int i=1;i<=m;i++)
{
//cout<<"A";
cin>>bz;
//scanf(" %c",&bz);
if(bz=='C')
{
X=read();Y=read();Z=read();
add_road(X,Y,Z);
}
else
{
X=read();Y=read();
cout<<get_road(X,Y)<<endl;
}
}
return 0;
}
不急,离线等。