总结:
D1T1T2的思路较为好想,D1T3考试时估计是战略放弃的对象,D2T1思路容易卡在优化状态上(虽然明显3n的状态中有很多无用状态,从而想到子集最优,选择子集最优容易发现反例,从而考虑连带周边一起考虑,去年考场上想出来的,今年却想不出来***)但50十分容易,D2T2的式子超出目前水平(多项式的式子推法需要继续加强),D2T3在学过MinMax容斥以及树上高斯消元(好像还需要FWT)后较为简单,目前水平在250-380中来回飘荡,感觉pkuwc2019要完。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define X first 5 #define Y second 6 #define N 300005 7 #define P 998244353 8 struct st{int l,r,v,tg;}T[N*20]; 9 int n,cc,tt,ans,p[N],d[N],ch[N][2],rt[N]; 10 pair<int,int>q[N]; 11 int pw(int a,int b){int r=1;for(;b;b>>=1,a=1ll*a*a%P)if(b&1)r=1ll*r*a%P;return r;} 12 int sqr(int x){return 1ll*x*x%P;} 13 void down(int x) 14 { 15 if(T[x].tg!=1) 16 { 17 T[T[x].l].tg=1ll*T[T[x].l].tg*T[x].tg%P; 18 T[T[x].l].v=1ll*T[T[x].l].v*T[x].tg%P; 19 T[T[x].r].tg=1ll*T[T[x].r].tg*T[x].tg%P; 20 T[T[x].r].v=1ll*T[T[x].r].v*T[x].tg%P; 21 T[x].tg=1; 22 } 23 } 24 void upd(int &x,int l,int r,int p) 25 { 26 x=++cc;T[x].v=T[x].tg=1; 27 if(l==r)return; 28 int mid=l+r>>1; 29 if(p<=mid)upd(T[x].l,l,mid,p);else upd(T[x].r,mid+1,r,p); 30 } 31 int merge(int x,int y,int p,int pl1,int pl2,int pr1,int pr2) 32 { 33 if(!x&&!y)return 0; 34 if(x&&!y) 35 { 36 int q=(P+1-p),r=(1ll*p*pl2+1ll*q*pr2)%P; 37 T[x].v=1ll*T[x].v*r%P; 38 T[x].tg=1ll*T[x].tg*r%P; 39 return x; 40 } 41 if(!x&&y) 42 { 43 int q=(P+1-p),r=(1ll*p*pl1+1ll*q*pr1)%P; 44 T[y].v=1ll*T[y].v*r%P; 45 T[y].tg=1ll*T[y].tg*r%P; 46 return y; 47 } 48 down(x);down(y); 49 int r1=T[T[x].r].v,r2=T[T[y].r].v,r3=T[T[x].l].v,r4=T[T[y].l].v; 50 T[x].l=merge(T[x].l,T[y].l,p,pl1,pl2,(pr1+r1)%P,(pr2+r2)%P); 51 T[x].r=merge(T[x].r,T[y].r,p,(pl1+r3)%P,(pl2+r4)%P,pr1,pr2); 52 T[x].v=(T[T[x].l].v+T[T[x].r].v)%P;return x; 53 } 54 void dfs(int x) 55 { 56 if(d[x]==0)return; 57 if(d[x]==1){dfs(ch[x][0]);rt[x]=rt[ch[x][0]];return;} 58 dfs(ch[x][0]);dfs(ch[x][1]); 59 rt[x]=merge(rt[ch[x][0]],rt[ch[x][1]],p[x],0,0,0,0); 60 } 61 void qry(int x,int l,int r) 62 { 63 if(!x)return; 64 if(l==r){ans=(ans+1ll*l*q[l].X%P*sqr(T[x].v))%P;return;} 65 int mid=l+r>>1;down(x);qry(T[x].l,l,mid);qry(T[x].r,mid+1,r); 66 } 67 int main() 68 { 69 scanf("%d",&n); 70 for(int i=1,fa;i<=n;i++)scanf("%d",&fa),ch[fa][d[fa]++]=i; 71 int iv=pw(10000,P-2); 72 for(int i=1;i<=n;i++)scanf("%d",&p[i]); 73 for(int i=1;i<=n;i++)if(!d[i])q[++tt]=make_pair(p[i],i);else p[i]=1ll*p[i]*iv%P; 74 sort(q+1,q+tt+1); 75 for(int i=1;i<=tt;i++)upd(rt[q[i].Y],1,tt,i); 76 dfs(1);qry(rt[1],1,tt);printf("%d\n",ans); 77 return 0; 78 }