题目链接

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. python collection 中的队列

    认识中的队列 在以前的认知里,队列是先进先出,就是一头进,一头出,Queue.而无意间看到了deque 双向队列. 即从该队列的头或者尾部都能插入和移除元素.而起时间复杂度竟然是一样的!O(1),是不 ...

  2. 使用python开发一个能够计算带括号的复杂表达式的计算器(只支持加减乘除)

    使用到了模块re,正则,字典等 # 实现简单的加减乘除括号等运算 # Calculator def calculator(expression): print(expression) import r ...

  3. CentOS6.6中安装telnet

    一.查看本机是否安装telnet rpm -qa | grep telnet 如果什么都不显示.说明你没有安装telnet 二.开始安装 yum install xinetd yum install ...

  4. accept系统调用

    /* * For accept, we attempt to create a new socket, set up the link * with the client, wake up the c ...

  5. pom可以过滤resource 下的文件

  6. ubuntu使用百度云盘插件

    Firefox 插件地址 https://addons.mozilla.org/zh-CN/firefox/addon/baidu-pan-exporter/ 安装后重启Firefox,然后百度云下载 ...

  7. 公司xenserver搭建的使用

    [root@xenserver ~]# ls -l /dev/disk/by-path/total 0lrwxrwxrwx 1 root root  9 Jan 19 16:33 pci-0000:0 ...

  8. 【前端vue开发】Hbuilder配置Avalon、AngularJS、Vue指令提示

    偶尔也会研究一下前端内容,因为Hbuilder是基于eclipse开发的,所以用起来倍感亲切啊,而且在我尝试使用的几款前端开发工具中,Hbuilder的表现也是相当出色地,可以访问Huilder官网下 ...

  9. java基础72 junit单元测试

    1.junit要注意的细节 1.如果junit测试一个方法,在junit窗口上显示绿色代表测试成功:如果显示红条,则代表测试方法出现异常不通过.    2.如果点击方法名.包名.类名.工程名运行jun ...

  10. UFLDL(五)自编码算法与稀疏性

    新教程内容太繁复,有空再看看,这节看的还是老教程: http://ufldl.stanford.edu/wiki/index.php/%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE ...