笙瑟 @ 2019-03-05 20:10:16
#include<bits/stdc++.h>
using namespace std;
int n,m,q,cnt,s,x,y,z,t1,t2,top,tot,l,r,now,t;
long long ans,anss[100005];
int a[100005],b[100005],v[100005],w[100005],fir[200005],nex[200005],to[200005];
int f[100005][30],depth[100005],sta[100005],xx[100005],yy[100005],num[100005];
bool vis[100005];
struct query
{
int l,r,note,xg;
bool operator<(query&x)
{
return b[l]==b[x.l] ? (b[r]==b[x.r] ? xg<x.xg :b[r]<b[x.r]):b[l]<b[x.l];
}
}c[100005];
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(s>'9' or s<'0'){if(s=='-')f=-1;s=getchar();}
while(s>='0' and s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
}
void add(int x,int y)
{
to[++cnt]=y;
nex[cnt]=fir[x];
fir[x]=cnt;
}
void dfs(int now,int father)
{
t=top;
f[now][0]=father;
depth[now]=depth[father]+1;
for(int i=1;(1<<i)<=depth[now];i++)
f[now][i]=f[f[now][i-1]][i-1];
for(int i=fir[now];i!=0;i=nex[i])
if (to[i]!=father)
{
dfs(to[i],now);
if (top-t>=s)
{
++tot;
while (top>t) b[sta[top--]]=tot;
}
}
sta[++top]=x;
}
int lca(int a,int b)
{
if (depth[a]>depth[b]) swap(a,b);
for(int i=16;i>=0;i--)
if (depth[a]<=depth[b]-(1<<i))
b=f[b][i];
if (a==b) return(a);
for(int i=16;i>=0;i--)
if (f[a][i]!=f[b][i])
{
a=f[a][i];b=f[b][i];
}
return(f[a][0]);
}
inline void opp(int x)
{
if (vis[x]) ans-=1ll*v[a[x]]*w[num[a[x]]--];
else ans+=1ll*v[a[x]]*w[++num[a[x]]];
vis[x]^=1;
}
inline void dmodify(int u,int v)
{
if (depth[u]<depth[v]) swap(u,v);
while (depth[u]>depth[v])
{
opp(u);
u=f[u][0];
}
while (u!=v)
{
opp(u);
opp(v);
u=f[u][0];
v=f[v][0];
}
}
inline void modify(int now)
{
if (vis[xx[now]])
{
opp(xx[now]);
swap(a[xx[now]],yy[now]);
opp(xx[now]);
}
else swap(a[xx[now]],yy[now]);
}
int main()
{
in(n);in(m);in(q);
s=pow(n,0.6666);
for(int i=1;i<=m;i++) in(v[i]);
for(int i=1;i<=n;i++) in(w[i]);
for(int i=1;i<=n-1;i++) in(x),in(y),add(x,y),add(y,x);
for(int i=1;i<=n;i++) in(a[i]);
dfs(1,0);
tot++;
while (top)
{
b[sta[top--]]=tot;
}
for(int i=1;i<=q;i++)
{
in(z);
if (z==0)
{
++t2;
in(xx[t2]),in(yy[t2]);
}
else
{
++t1;
in(c[t1].l);in(c[t1].r);
c[t1].note=t1;
c[t1].xg=t2;
}
}
sort(c+1,c+t1+1);
l=1;r=1;now=0;
int llca;
for(int i=1;i<=t1;i++)
{
dmodify(l,c[i].l);
dmodify(r,c[i].r);
l=c[i].l;r=c[i].r;
while (now<c[i].xg) modify(++now);
while (now>c[i].xg) modify(now--);
llca=lca(l,r);
opp(llca);
anss[c[i].note]=ans;
opp(llca);
}
for(int i=1;i<=t1;i++)
printf("%lld\n",anss[i]);
}
by aminoas @ 2019-03-05 20:13:50
你的时间复杂度太高了
by 笙瑟 @ 2019-03-05 20:37:45
@2018J1605 那怎么改进呢?
by aminoas @ 2019-03-05 20:39:17
wobuhui