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的更多相关文章
- 【LOJ】#2537. 「PKUWC2018」Minimax
题解 加法没写取模然后gg了QwQ,de了半天 思想还是比较自然的,线段树合并的维护方法我是真的很少写,然后没想到 很显然,我们有个很愉快的想法是,对于每个节点枚举它所有的叶子节点,对于一个叶子节点的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3044. 「ZJOI2019」Minimax 搜索
Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关 ...
- LOJ #2541「PKUWC2018」猎人杀
这样$ PKUWC$就只差一道斗地主了 假装补题补完了吧..... 这题还是挺巧妙的啊...... LOJ # 2541 题意 每个人有一个嘲讽值$a_i$,每次杀死一个人,杀死某人的概率为$ \fr ...
- LOJ #2542「PKUWC2018」随机游走
$ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...
- LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt
题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...
- LOJ 2541 「PKUWC2018」猎人杀——思路+概率+容斥+分治
题目:https://loj.ac/problem/2541 看了题解才会……有三点很巧妙. 1.分母如果变动,就很不好.所以考虑把操作改成 “已经选过的人仍然按 \( w_i \) 的概率被选,但是 ...
- LOJ2537. 「PKUWC2018」Minimax【概率DP+线段树合并】
LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小 ...
- loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)
题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...
随机推荐
- 配置多个ssh-key
搞了三天没搞出来,还在男朋友面前哭了一场,真心觉得我只该吃屎,我好没用.哎.. 首先在上一篇记录了如何生成ssh-key,并使本地可以通过ssh的方式克隆和推送项目.但如果你有个github账号,有个 ...
- 推荐一本springBoot学习书籍---深入浅出springBoot2.x
花了几周时间读完了这本书,确实是一本特别详细全面的书,而且不单单只是springBoot, 书中还介绍了许多工作中常用的技术与springBoot的整合使用,当然,也有一些小bug, 因为在代码实践过 ...
- js原生选择class DOM元素
document.querySelector(".demo"); querySelector() 方法返回匹配指定选择器的第一个元素.如果需要返回所有的元素,使用 querySel ...
- CentOS7网卡改名
# vi /etc/sysconfig/grub 修改上面内容中的GRUB_CMDLINE_LINUX的值,增加net.ifnames=0 biosdevname=0 执行:grub2-mkconfi ...
- eclipse导入/导出项目要注意三个地方
这个三个地方的jdk必须保持一致,不报错
- UFLDL(五)自编码算法与稀疏性
新教程内容太繁复,有空再看看,这节看的还是老教程: http://ufldl.stanford.edu/wiki/index.php/%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE ...
- 洛谷P2017晕牛
传送门啦 这个题没有想象中复杂. 我们先有向边建立,因为我们无法改变有向边的方向. 建立完之后跑一边拓扑排序,我们按拓扑序小的指向大的就好了. 解释: 我们知道如果一个点在另一个点顺序的后面的话,如果 ...
- dedecms调用文章列表第一篇和下面几篇不同的方法
{dede:arclist row=1 orderby=pubdate infolen=60 limit=0,1} <li class="dot1"><img s ...
- Codeforces 734C Anton and Making Potions(枚举+二分)
题目链接:http://codeforces.com/problemset/problem/734/C 题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,第一类周瑜有m种,每种 ...
- redis主从,哨兵(windows版)
一.下载 由于redis官方并不支持windows操作系统,所以官网上是下不到的,需要到gitlab上下载,下载地址如下: https://github.com/MicrosoftArchive/re ...