传送门

发现其实就是左右2棵子树,左儿子选到某个值的概率就是
选最大值的概率∗右儿子的值比它小的概率选最大值的概率*右儿子的值比它小的概率选最大值的概率∗右儿子的值比它小的概率
+选最小值的概率∗右儿子的值比他大的概率+选最小值的概率*右儿子的值比他大的概率+选最小值的概率∗右儿子的值比他大的概率

右儿子类似

由于保证所有值不都相等
然后上线段树合并mergemergemerge的时候dpdpdp一下就完了

复杂度O(nlogn)O(nlogn)O(nlogn)

#include<bits/stdc++.h>
using namespace std;
const int RLEN=1<<20|1;
inline char gc(){static char ibuf[RLEN],*ib,*ob;(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++;
}
inline int read(){char ch=gc();int res=0,f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res;
}
const int mod=998244353;
const int N=500005;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;
}
inline void selfadd(int &a,int b){a=add(a,b);
}
inline int dec(int a,int b){return a>=b?a-b:a-b+mod;
}
inline int mul(int a,int b){return 1ll*a*b>=mod?1ll*a*b%mod:a*b;
}
inline void selfmul(int &a,int b){a=mul(a,b);
}
inline int ksm(int a,int b,int res=1){for(;b;b>>=1,a=mul(a,a))if(b&1)selfmul(res,a);return res;
}
int cnt[N],son[N][2],rt[N],val[N],pmx[N];
int fa[N],ori[N],ans,n;
struct node{int k,p;friend inline bool operator <(const node &a,const node &b){return a.k<b.k;}
}q[N];int tot;
namespace Seg{#define mid ((l+r)>>1)int tot,cnt,mxa,mxb;int lc[N*22],rc[N*22],tag[N*22],tr[N*22];void update(int &u,int l,int r,int k){u=++tot,tag[u]=1,tr[u]=1;if(l==r)return;if(k<=mid)update(lc[u],l,mid,k);else update(rc[u],mid+1,r,k);}inline void pushup(int u){tr[u]=add(tr[lc[u]],tr[rc[u]]);}inline void pushnow(int u,int t){selfmul(tag[u],t);selfmul(tr[u],t);}inline void pushdown(int u){if(tag[u]==1)return;int &t=tag[u];if(lc[u])pushnow(lc[u],t);if(rc[u])pushnow(rc[u],t);t=1;}int merge(int r1,int r2,int g){if(!r1&&!r2)return 0;pushdown(r1),pushdown(r2);if(!r1){selfadd(mxb,tr[r2]);pushnow(r2,dec(add(mxa,g),mul(2,mul(mxa,g))));return r2;}if(!r2){selfadd(mxa,tr[r1]);pushnow(r1,dec(add(mxb,g),mul(2,mul(mxb,g))));;return r1;}rc[r1]=merge(rc[r1],rc[r2],g);lc[r1]=merge(lc[r1],lc[r2],g);pushup(r1);return r1;}void dfs(int u){if(!::cnt[u])return;else if(::cnt[u]==1)dfs(son[u][0]),rt[u]=rt[son[u][0]];else if(::cnt[u]==2){dfs(son[u][0]),dfs(son[u][1]);mxa=mxb=0;rt[u]=merge(rt[son[u][0]],rt[son[u][1]],pmx[u]);}}void calc(int u,int l,int r){if(!tr[u])return;pushdown(u);if(l==r){cnt++;selfadd(ans,mul(mul(mul(cnt,ori[l]),tr[u]),tr[u]));return;}calc(lc[u],l,mid),calc(rc[u],mid+1,r);}
}
signed main(){n=read();for(int i=1;i<=n;i++){fa[i]=read();son[fa[i]][cnt[fa[i]]++]=i;}int inv=ksm(10000,mod-2);for(int i=1;i<=n;i++){int k=read();if(cnt[i])pmx[i]=mul(k,inv);else{q[++tot]=(node){k,i};}}sort(q+1,q+tot+1);for(int i=1;i<=tot;i++){ori[i]=q[i].k,Seg::update(rt[q[i].p],1,tot,i);}Seg::dfs(1);Seg::calc(rt[1],1,tot);cout<<ans;
}

转载于:https://www.cnblogs.com/stargazer-cyk/p/11145564.html

【BZOJ5461】 【PKUWC2018】—Minimax(线段树合并优化dp)相关推荐

  1. P6773-[NOI2020]命运【线段树合并,树形dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P6773 题目大意 nnn个点的一棵树,边权可以是000或111.mmm个条件(x,y)(x,y)(x,y)表示要求 ...

  2. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  3. uoj#388. 【UNR #3】配对树(线段树合并)

    传送门 先考虑一个贪心,对于一条边来说,如果当前这个序列中在它的子树中的元素个数为奇数个,那么这条边就会被一组匹配经过,否则就不会 考虑反证法,如果在这条边两边的元素个数都是偶数,那么至少有两组匹配经 ...

  4. loj2537 「PKUWC2018」Minimax 【概率 + 线段树合并】

    题目链接 loj2537 题解 观察题目的式子似乎没有什么意义,我们考虑计算出每一种权值的概率 先离散化一下权值 显然可以设一个\(dp\),设\(f[i][j]\)表示\(i\)节点权值为\(j\) ...

  5. 【PKUWC2018】Minimax【线段树合并】

    题意:给定一棵nnn个点的二叉树,叶子的权值输入给定且互不相同,非叶子结点iii的权值有pip_ipi​的概率为儿子结点权值最大值,1−pi1-p_i1−pi​的概率为最小值.求根结点取每种值的概率. ...

  6. 【九省联考2018】秘密袭击【树形dp】【生成函数】【线段树合并】【多项式插值】

    题意:nnn 个点的带点权的树,点权最大值为 www,求所有连通子图第 kkk 大权值之和模 641236412364123. n,w≤1666n,w\leq 1666n,w≤1666,时限 5s. ...

  7. 【NOI2020】命运【树形dp】【线段树合并】

    题意:给一棵 nnn 个点的树,每条边需要染成黑白两种颜色中的一种.给出 mmm 个条件,每个条件给出 u,vu,vu,v,其中 uuu 是 vvv 的祖先,要求 uuu 到 vvv 的链上至少一条黑 ...

  8. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  9. Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)

    题目链接 \(Description\) 给定一个字符串\(s[1]\).一个字符串序列\(s[\ ]\)满足\(s[i]\)至少在\(s[i-1]\)中出现过两次(\(i\geq 2\)).求最大的 ...

最新文章

  1. 腾讯微博qq说说备份导出工具_10年了!腾讯微博宣布关停,宜昌90后的青春不再!...
  2. 【解析】1057 数零壹 (20分)(进制转换)
  3. 安装了silverlight还是提示_win10系统安装.netframework3.5方法
  4. 烟台大学计算机专业调剂贴吧,烟台大学计算机与控制工程学院2021年考研复试与调剂的说明...
  5. mysql 5.5 升级_Windows下MySQL5.5升级MySQL5.7
  6. 使用spring cloud,nacos,dubbo,gateway搭建微服务
  7. PostgreSQL/pgsql生成随机的姓名的函数
  8. 每日一面 - 从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?
  9. strongswan与sangfor的ikev2配置
  10. JAVA毕业设计vue健康餐饮管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  11. 零基础学python_03_字符串(拼接+换行+制表符)
  12. 根据行数要求实现展开与隐藏TextView
  13. 直流无刷电机(BLDC)与永磁同步电机(PMSM)的区别
  14. Linux命令简写与全称
  15. 解决Chrome 70版本以后谷歌不再信任赛门铁克证书问题
  16. matlab用sym出错,使用sym.int时出错输入参数太多
  17. 获取省市区geoJson数据(精确到县、镇)用于echarts实现地图数据可视化
  18. [自考总结]想要去的远方,终有一天会到达
  19. SQL 数据操纵语言
  20. 嵌入式软件解决ADC电量显示问题经验分享

热门文章

  1. 深入浅出理解Javascript原型概念以及继承机制(转)
  2. 学会使用svn:externals
  3. OpenCV alpha(权因子) 融合举例
  4. 计算机也可以看“视频”,理解“视频”
  5. 视音频技术零基础学习方法
  6. Valgrind使用说明
  7. 高性能IO -Reactor模式的实现
  8. Android:动态加载布局
  9. TCP/IP五层参考模型及其对应设备--运维笔记
  10. 数据中心机房夏日降温措施