题目链接

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. go语言 documentation

    Documentation文档   The Go programming language is an open source project to make programmers more pro ...

  2. android studio实现Intent通信-------牛刀小试

    概述: 本博文实现一种小程序,两个Activity单向通信,主从关系,MainActivty 页面布局一个EditText+Button,实现逻辑是单击按钮将信息发送给另外一个DisplayMessa ...

  3. 获取矩形局域的方法,Rect、Bounds、Point

    获取一个点和矩形区域的方法如下: var R: TRect; procedure TForm5.FormCreate(Sender: TObject); begin RadioGroup1.Items ...

  4. ubuntu和windows双系统启动顺序的修改

    ubuntu和windows双系统启动顺序的修改 说到启动就不得不说GRUB,Linux下大名鼎鼎的启动管理工具(曾经的LILO已经风光不再),当然现在已经是GRUB2了,GRUB2和GRUB最重要的 ...

  5. Robots.txt 不让搜索引擎收录网站的方法

    有没有担心过自己的隐私会在强大的搜索引擎面前无所遁形?想象一下,如果要向世界上所有的人公开你的私人日记,你能接受吗?的确是很矛盾的问题,站长们大都忧虑“如何让搜索引擎收录的我的网站?”,而我们还是要研 ...

  6. Docker网络和存储

    本节内容: Docker网络访问 端口映射 数据管理 一.Docker网络访问 1. docker自带的网络 docker network ls:列出当前docker中已有的网络 docker net ...

  7. Hive(二)CentOS7.5安装Hive2.3.3

    一 Hive的下载 软件下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/  这里下载的版本是:apache-hive-2.3.3-bin.t ...

  8. python开发学习-day14(jquery、ajax等)

    s12-20160421-day14 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  9. git status中文文件名编码问题解决

    在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码. 通过将git配置变量 core.quotepath 设置为false,就可以解决中文文件名称在这些Git命令 ...

  10. 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest B - Bring Your Own Bombs 离散化+扫描线+计算期望

    扫描线一边扫一边算期望,细节比较多. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...