正当我在庆幸一发就A掉了P3313时,去学校OJ交了原题,结果全RE了。
学校OJ的编译配置为c++14 o2(不可更改)
希望有人帮我看看有啥原因会导致RE
分块写法,复杂度 O(qnlogn)。
#include<bits/stdc++.h>
#define gc getchar()
#define rd read()
#define N 100005
#define K 1405
using namespace std;
inline int read()
{
unsigned int x=0,s=gc;
while(!isdigit(s))s=gc;
while(isdigit(s))x=(x<<1)+(x<<3)+(s^48),s=gc;
return x;
}
inline void chkmax(int &x,int y){x=(x>y?x:y);}
int n,m,cnt;
int dep[N],fa[N],dfn[N],siz[N];
int son[N],seg[N],rev[N],top[N];
int a[N],col[N],val[N],block;
int _col[N],_val[N];
int sumv[N][K],maxx[N][K];
int bl[N],L[K],R[K],tot;
vector<int> v[N];
void dfs(int x,int f,int deep)
{
dep[x]=deep;
fa[x]=f;
siz[x]=1;
int maxx=0;
for(auto j:v[x])
if(fa[x]!=j)
{
dfs(j,x,deep+1);
if(maxx<siz[j])son[x]=j,maxx=siz[j];
siz[x]+=siz[j];
}
}
void dfs2(int x,int y)
{
seg[x]=++cnt;
rev[cnt]=x,top[x]=y;
if(!son[x])return;
dfs2(son[x],y);
for(auto j:v[x])
if(j!=fa[x]&&j!=son[x])
dfs2(j,j);
}
void ccol(int x,int y)
{
int c=col[x],k=bl[x];
col[x]=y,maxx[c][k]=maxx[y][k]=INT_MIN,sumv[c][k]=sumv[y][k]=0;
for(int i=L[k];i<=R[k];i++)
{
if(col[i]==y)chkmax(maxx[y][k],val[i]),sumv[y][k]+=val[i];
if(col[i]==c)chkmax(maxx[c][k],val[i]),sumv[c][k]+=val[i];
}
}
void cval(int x,int y)
{
val[x]=y;
int k=bl[x];maxx[col[x]][k]=INT_MIN,sumv[col[x]][k]=0;
for(int i=L[k];i<=R[k];i++)
if(col[i]==col[x])sumv[col[x]][k]+=val[i],chkmax(maxx[col[x]][k],val[i]);
}
int ask1(int c,int l,int r)
{
int ans=0;
if(bl[l]==bl[r])
{
for(int i=l;i<=r;i++)if(col[i]==c)ans+=val[i];
return ans;
}
for(int i=bl[l]+1;i<bl[r];i++)ans+=sumv[c][i];
for(int i=l;bl[i]==bl[l];i++)if(col[i]==c)ans+=val[i];
for(int i=r;bl[i]==bl[r];i--)if(col[i]==c)ans+=val[i];
return ans;
}
int ask2(int c,int l,int r)
{
int ans=INT_MIN;
if(bl[l]==bl[r])
{
for(int i=l;i<=r;i++)if(col[i]==c)chkmax(ans,val[i]);
return ans;
}
for(int i=bl[l]+1;i<bl[r];i++)chkmax(ans,maxx[c][i]);
for(int i=l;bl[i]==bl[l];i++)if(col[i]==c)chkmax(ans,val[i]);
for(int i=r;bl[i]==bl[r];i--)if(col[i]==c)chkmax(ans,val[i]);
return ans;
}
int asum(int c,int x,int y)
{
int ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=ask1(c,seg[top[x]],seg[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans+=ask1(c,seg[x],seg[y]);
return ans;
}
int amax(int c,int x,int y)
{
int ans=INT_MIN;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
chkmax(ans,ask2(c,seg[top[x]],seg[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
chkmax(ans,ask2(c,seg[x],seg[y]));
return ans;
}
signed main()
{
n=rd,m=rd,block=sqrt(n/log2(n)),tot=(n/block+(n%block?1:0));
for(int i=1;i<=n;bl[i]=(i-1)/block+1,i++)_val[i]=rd,_col[i]=rd;
for(int i=1;i<=tot;i++)L[i]=R[i-1]+1,R[i]=i*block;R[tot]=n;
for(int i=1;i<n;i++)
{
int x=rd,y=rd;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,0,1),dfs2(1,1);
for(int i=1;i<=n;i++)col[i]=_col[rev[i]],val[i]=_val[rev[i]];
for(int i=1;i<=n;i++)
{
sumv[col[i]][bl[i]]+=val[i];
chkmax(maxx[col[i]][bl[i]],val[i]);
}
while(m--)
{
string op;int x,y;
cin>>op;x=rd,y=rd;
if(op=="CC")ccol(seg[x],y);
if(op=="CW")cval(seg[x],y);
if(op=="QS")cout<<asum(col[seg[x]],x,y)<<'\n';
if(op=="QM")cout<<amax(col[seg[x]],x,y)<<'\n';
}
return 0;
}