总结:

D1T1T2的思路较为好想,D1T3考试时估计是战略放弃的对象,D2T1思路容易卡在优化状态上(虽然明显3n的状态中有很多无用状态,从而想到子集最优,选择子集最优容易发现反例,从而考虑连带周边一起考虑,去年考场上想出来的,今年却想不出来***)但50十分容易,D2T2的式子超出目前水平(多项式的式子推法需要继续加强),D2T3在学过MinMax容斥以及树上高斯消元(好像还需要FWT)后较为简单,目前水平在250-380中来回飘荡,感觉pkuwc2019要完。

loj#2537. 「PKUWC2018」Minimax

 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 }
View Code

相关文章:

  • 2021-09-04
  • 2021-09-10
  • 2022-12-23
  • 2021-07-14
  • 2022-02-09
  • 2021-08-13
猜你喜欢
  • 2021-11-10
  • 2021-06-29
  • 2022-12-23
  • 2021-06-25
  • 2022-12-23
  • 2021-05-30
相关资源
相似解决方案