如题。。。
当我写完了题,交上去全wa,可本地测试后发现输出内容竟然和下载下来的P4074_1.out完全一样,可为啥会wa呢,明明一样啊?求助大佬们,帮帮我!!!!!!!!!!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e6+10;
struct Edge{
int v,nxt;
}e[N];
int hd[N],tt;
void init(){
memset(hd,-1,sizeof(hd));
}
void add(int x,int y){
e[++tt].v=y;
e[tt].nxt=hd[x];
hd[x]=tt;
}
int fa[N],son[N],dep[N],siz[N];
void dfs1(int u){
siz[u]=1;
for(int i=hd[u];~i;i=e[i].nxt){
int v=e[i].v;
if(v==fa[u]) continue;
fa[v]=u;
dep[v]=dep[u]+1;
dfs1(v);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]])
son[u]=v;
}
}
int top[N];
void dfs2(int u,int t){
top[u]=t;
if(son[u])
dfs2(son[u],t);
for(int i=hd[u];~i;i=e[i].nxt){
int v=e[i].v;
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int get_lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return dep[x]>dep[y]?y:x;
}
int id[N],in[N],out[N],cnt;
void get_id(int u){
in[u]=++cnt;
id[cnt]=u;
for(int i=hd[u];~i;i=e[i].nxt){
int v=e[i].v;
if(v==fa[u]) continue;
get_id(v);
}
out[u]=++cnt;
id[cnt]=u;
}
int n,m,q,c[N],qcnt,rcnt,len,num[N];
ll w[N],v[N],sum=0,ans[N];
bool vis[N];
struct ques{
int l,r,t,id;
ques(){}
ques(int _l,int _r,int _t,int _id){
l=_l,r=_r,t=_t,id=_id;
}
}Q[N];
bool cmp(ques A,ques B){
if((A.l-1)/len!=(B.l-1)/len) return A.l<B.l;
if((A.r-1)/len!=(B.r-1)/len) return A.r<B.r;
return A.t<B.t;
}
pair<int,int> R[N];
void upd(int x){
if(vis[x]) sum-=v[c[x]]*w[num[c[x]]--];
else sum+=v[c[x]]*w[++num[c[x]]];
vis[x]^=1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
init();
cin>>n>>m>>q;
len=pow(n,2.0/3.0);
for(int i=1;i<=m;i++) cin>>v[i];
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1,x,y;i<n;i++){
cin>>x>>y;
add(x,y);add(y,x);
}
dfs1(1);
dfs2(1,1);
get_id(1);
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1,opt,x,y;i<=q;i++){
cin>>opt>>x>>y;
if(opt==0) R[++rcnt]=make_pair(x,y);
else{
if(in[x]>in[y]) swap(x,y);
Q[++qcnt]=ques(get_lca(x,y)==x?in[x]:out[x],in[y],rcnt,qcnt);
}
}
sort(Q+1,Q+1+qcnt,cmp);
for(int i=1,l=0,r=0,t=0;i<=qcnt;i++){
while(t<Q[i].t){
t++;
if(vis[R[t].first]){
upd(R[t].first);
swap(c[R[t].first],R[t].second);
upd(R[t].first);
}
else swap(c[R[t].first],R[t].second);
}
while(t>Q[i].t){
if(vis[R[t].first]){
upd(R[t].first);
swap(c[R[t].first],R[t].second);
upd(R[t].first);
}
else swap(c[R[t].first],R[t].second);
t--;
}
while(l>Q[i].l) upd(id[--l]);
while(r<Q[i].r) upd(id[++r]);
while(l<Q[i].l) upd(id[l++]);
while(r>Q[i].r) upd(id[r--]);
int xx=id[l],yy=id[r],lca=get_lca(xx,yy);
if(lca!=xx&&lca!=yy){
upd(lca);
ans[Q[i].id]=sum;
upd(lca);
}
else ans[Q[i].id]=sum;
}
for(int i=1;i<=qcnt;i++)
cout<<ans[i]<<'\n';
return 0;
}
/*
20 20 20
338985 290791 463601 487134 164037 217966 634037 150123 864209 974801 42241 909963 920357 443745 134001 852157 115722 364223 450033 259781
963481 938865 915101 822609 811713 768863 730441 590323 563935 559238 483185 478333 476461 431631 360547 123470 103899 93068 51575 31346
19 11
19 18
19 3
11 5
18 17
3 20
5 15
17 1
20 12
6 1
16 11
10 6
13 15
7 15
9 18
4 7
8 11
14 1
2 19
1 9 1 1 17 3 6 1 11 17 5 14 16 2 13 20 11 12 1 3
1 7 19
0 13 5
0 15 9
0 17 1
1 2 20
0 14 1
1 12 5
0 16 1
1 15 16
1 16 7
1 4 5
1 3 13
0 15 11
1 17 7
1 17 13
1 13 18
1 5 9
1 7 11
1 11 14
1 1 11
*/
/*
1692900670227
1924186465420
1788619871315
1428797039393
1638803139039
1480756606242
1901066789423
2041845801659
1985848300018
1667587147993
1513578549988
520246981646
2268702977160
1989850865295
*/