题目链接

loj#2537. 「PKUWC2018」Minimax

题解

设\(f_{u,i}\)表示选取i的概率,l为u的左子节点,r为u的子节点

$f_{u,i} = f_{l,i}(p \sum_{j < i} + (1 - p)\sum_{j > i}f_{r,j}) + f_{r,i}(p\sum_{j < i}f_{l,i} + (1 - p)\sum_{j > i}f_{l,j}) $

对于每个节点s维护当前节点所有可能的概率和 ,线段树合并

代码

#include<bits/stdc++.h> 

inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c <= '9' && c >= '0') x= x * 10 + c - '0',c = getchar();
return x * f;
}
#define LL long long
const int maxn = 300007;
const int mod = 998244353;
const int inv = 796898467; int a[maxn];
int son[maxn][2], fa[maxn];
int rt[maxn];
int n = 0,m = 0;
LL s[maxn * 20],tag[maxn * 20],w[maxn],b[maxn],p;
int lc[maxn * 20],rc[maxn * 20],tot = 0; inline void mul(int x,LL t){s[x] = s[x] * t % mod ,tag[x] = tag[x] * t % mod;} void push_down(int x) {
if(tag[x] == 1) return;
mul(lc[x],tag[x]); mul(rc[x],tag[x]);
tag[x] = 1;
} void insert(int &x,int l,int r,int rk) {
if(!x) x = ++ tot; s[x] = tag[x] = 1;
if(l == r) return;
int mid = l + r >> 1;
if(rk <= mid) insert(lc[x],l,mid,rk);
else if(rk > mid) insert(rc[x],mid + 1,r,rk);
}
int merge(int x,int y,LL sumx = 0,LL sumy = 0) {
if(!x) {mul(y,sumx);return y;}
if(!y) {mul(x,sumy);return x;}
push_down(x);push_down(y);
LL x0 = s[lc[x]],x1 = s[rc[x]],y0 = s[lc[y]],y1 = s[rc[y]];
lc[x] = merge(lc[x],lc[y],(sumx + (1 + mod - p) * x1) % mod,(sumy + (1 + mod - p) * y1) % mod);
rc[x] = merge(rc[x],rc[y],(sumx + p * x0) % mod,(sumy + p * y0) % mod);
s[x] = (s[lc[x]] + s[rc[x]]) % mod;
return x;
}
int solve(int x) {
if(!son[x][0]) {
insert(rt[x],1,m,std::lower_bound(b + 1,b + m + 1,w[x]) - b);
return rt[x];
}
int rtl = solve(son[x][0]);
if(!son[x][1]) return rtl;
int rtr = solve(son[x][1]);
p = w[x];
return merge(rtl,rtr);
}
LL calc(int x,int l,int r) {
if(l == r) return 1ll * l * b[l] % mod * s[x] % mod * s[x] % mod;
push_down(x);
int mid = l + r >> 1;
return (calc(lc[x],l,mid) + calc(rc[x],mid + 1,r)) % mod;
}
int main() {
n = read();
for(int x,i = 1;i <= n;++ i) {
x = read();
son[x][0] ? son[x][1] = i : son[x][0] = i;
}
for(int i = 1;i <= n;++ i) {
LL x = read();
son[i][0] ? w[i] = x * inv % mod : w[i] = b[++ m] = x;
}
std::sort(b + 1,b + m + 1);
printf("%lld\n",calc(solve(1),1,m)) ;
return 0;
}

loj#2537. 「PKUWC2018」Minimax的更多相关文章

  1. 【LOJ】#2537. 「PKUWC2018」Minimax

    题解 加法没写取模然后gg了QwQ,de了半天 思想还是比较自然的,线段树合并的维护方法我是真的很少写,然后没想到 很显然,我们有个很愉快的想法是,对于每个节点枚举它所有的叶子节点,对于一个叶子节点的 ...

  2. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  3. Loj #3044. 「ZJOI2019」Minimax 搜索

    Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关 ...

  4. LOJ #2541「PKUWC2018」猎人杀

    这样$ PKUWC$就只差一道斗地主了 假装补题补完了吧..... 这题还是挺巧妙的啊...... LOJ # 2541 题意 每个人有一个嘲讽值$a_i$,每次杀死一个人,杀死某人的概率为$ \fr ...

  5. LOJ #2542「PKUWC2018」随机游走

    $ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...

  6. LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt

    题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...

  7. LOJ 2541 「PKUWC2018」猎人杀——思路+概率+容斥+分治

    题目:https://loj.ac/problem/2541 看了题解才会……有三点很巧妙. 1.分母如果变动,就很不好.所以考虑把操作改成 “已经选过的人仍然按 \( w_i \) 的概率被选,但是 ...

  8. LOJ2537. 「PKUWC2018」Minimax【概率DP+线段树合并】

    LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小 ...

  9. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)

    题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...

随机推荐

  1. springcloud中eureka集群unavailable-replicas

    unavailable-replicas 配置了集群,但是在注册中心显示另外的几个集群地址是不可用的: 1 首先需要再host中添加服务名映射,如果应映射了再看是否在yml中配置了prefer-ip- ...

  2. javade多任务处理之Executors框架(线程池)实现的内置几种方式与两种基本自定义方式

    一 Executors框架(线程池) 主要是解决开发人员进行线程的有效控制,原理可以看jdk源码,主要是由java.uitl.concurrent.ThreadPoolExecutor类实现的,这里只 ...

  3. springboot集成mybatis环境搭建以及实现快速开发微服务商品模块基本的增删改查!

    之前学习了springboot和mybatis3的一些新特性,初步体会了springboot的强大(真的好快,,,,,),最近趁着复习,参考着以前学习的教程,动手写了一个springboot实战的小例 ...

  4. 002_IO磁盘深入理解

    一.如何测试云硬盘 https://www.ustack.com/blog/how-benchmark-ebs/#fio

  5. kafka集群及监控部署

    1. kafka的定义 kafka是一个分布式消息系统,由linkedin使用scala编写,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础 ...

  6. No.16 selenium学习之路之异常处理

    一.常见的几种异常: SyntaxError:语法错误 NameError:试图访问的变量名不存在 IndexError:索引错误,使用的索引不存在,超出序列范围 KeyError:使用了不存在的关键 ...

  7. 解决Url带中文参数乱码问题

    这里我来介绍下如何配置Tomcat 来解决Url带中文参数乱码问题: 首先打开Tomcat安装目录,以Tomcat7为例,其他版本基本一样: 打开conf文件 打开server.xml 大概在70行左 ...

  8. Linux学习笔记:vi常用命令

    在Linux系统中常用vi命令进行文本编辑. vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器.Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved), ...

  9. CVE-2010-0249 极光

    传说中的极光漏洞 Microsoft Internet Explorer非法事件操作内存破坏漏洞 Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏 ...

  10. CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析

    漏洞简述   Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件.        Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此 ...