Problem

loj2537

Solution

pkuwc2018最水的一题,要死要活调了一个多小时(1h59min)

我写这题不是因为它有多好,而是为了保持pkuwc2018的队形,与这题类似的有一个好玩得多的题

由于答案的形式和期望相去甚远,所以可以肯定这题和期望无关,而且这么复杂的式子我们最好还是把所有可能计算出来啦

可以肯定地说这题是从叶子向根合并,合并时分类讨论下取最大\((p)\)还是最小\((1-p)\),然后维护前后缀概率和即可

再瞟一眼数据,发现线段树合并可以解决,完结

Code

注意由于线段树合并时若一个节点为空则直接返回,但这棵子树需要乘上整体概率,所以还要在裸的线段树合并中加上标记维护

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; inline void read(int&x){
char c11=getchar();x=0;while(!isdigit(c11))c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();
} const int N=301050,M=N*10,p=998244353;
struct Edge{int v,nxt;}a[N];
int ls[M],rs[M],f[M],lz[M];
int head[N],c[N],b[N],rt[N];
int n,_,tot; template <typename _tp> inline _tp qm(_tp x){return x<0?x+p:x<p?x:x-p;} void update(int l,int r,int&x,int vl){
if(!x)lz[x=++tot]=1;
if(l==r){f[x]=1;return ;}
int mid(l+r>>1);
if(vl<=mid)update(l,mid,ls[x],vl);
else update(mid+1,r,rs[x],vl);
f[x]=qm(f[ls[x]]+f[rs[x]]);
} inline void mul(int x,int vl){
f[x]=1ll*f[x]*vl%p;
lz[x]=1ll*lz[x]*vl%p;
} inline void down(int x){
if(ls[x])mul(ls[x],lz[x]);
if(rs[x])mul(rs[x],lz[x]);
lz[x]=1;
} int merge(int x,int y,ll p0,ll p1,ll p2){
if(x&&lz[x]!=1)down(x);
if(y&&lz[y]!=1)down(y);
if(!x){mul(y,p0*p1%p+qm(1-p0)*qm(1-p1)%p);return y;}
if(!y){mul(x,p0*p2%p+qm(1-p0)*qm(1-p2)%p);return x;}
rs[x]=merge(rs[x],rs[y],p0,qm(p1+f[ls[x]]),qm(p2+f[ls[y]]));
ls[x]=merge(ls[x],ls[y],p0,p1,p2);
f[x]=qm(f[ls[x]]+f[rs[x]]);
return x;
} void dfs(int x){
for(int i=head[x];i;i=a[i].nxt){
dfs(a[i].v);
if(!rt[x])rt[x]=rt[a[i].v];
else rt[x]=merge(rt[x],rt[a[i].v],c[x],0ll,0ll);
}
if(!head[x])update(1,n,rt[x],c[x]);
} int calc(int l,int r,int x){
if(lz[x]!=1)down(x);
if(l==r)return 1ll*l *b[l]%p *f[x]%p *f[x]%p;
int mid(l+r>>1);
return qm(calc(l,mid,ls[x])+calc(mid+1,r,rs[x]));
} int main(){
read(n);
for(int i=1,x;i<=n;++i){
read(x),a[++_].v=i;
a[_].nxt=head[x],head[x]=_;
}
int tt=0;const ll inv5=796898467;
for(int i=1;i<=n;++i){
read(c[i]);
if(head[i])c[i]=inv5*c[i]%p;
else b[++tt]=c[i];
}
sort(b+1,b+tt+1);
int end=unique(b+1,b+tt+1)-b;
for(int i=1;i<=n;++i)
if(!head[i])c[i]=lower_bound(b+1,b+end,c[i])-b;
n=end-1;dfs(1);
printf("%d\n",calc(1,n,1));
return 0;
}

题解-PKUWC2018 Minimax的更多相关文章

  1. BZOJ5461: [PKUWC2018]Minimax

    BZOJ5461: [PKUWC2018]Minimax https://lydsy.com/JudgeOnline/problem.php?id=5461 分析: 写出\(dp\)式子:$ f[x] ...

  2. LOJ2537:[PKUWC2018]Minimax——题解

    https://loj.ac/problem/2537 参考了本题在网上能找到的为数不多的题解. 以及我眼睛瞎没看到需要离散化,还有不开longlong见祖宗. ——————————————————— ...

  3. [PKUWC2018]Minimax 题解

    根据题意,若一个点有子节点,则给出权值:否则可以从子节点转移得来. 若没有子节点,则直接给出权值: 若只有一个子节点,则概率情况与该子节点完全相同: 若有两个子节点,则需要从两个子节点中进行转移. 如 ...

  4. 题解-PKUWC2018 随机算法

    Problem loj2540 题意简述:给定\(n\)个点的无向图,给定求最大独立集的近似算法:随机排列\(1\cdots n\),按照该排列顺序贪心构造最大独立集(即对每个点能加入独立集就加),求 ...

  5. [PKUWC2018] Minimax

    Description 给定一棵 \(n\) 个节点的树,每个节点最多有两个子节点. 如果 \(x\) 是叶子,则给定 \(x\) 的权值:否则,它的权值有 \(p_x\) 的概率是它子节点中权值的较 ...

  6. 题解-PKUWC2018 Slay the Spire

    Problem loj2538 Solution 在考场上当然要学会写暴力,考虑如果手上已经有了\(a\)张攻击牌和\(b\)张强化牌: 首先强化牌会在攻击牌之前用(废话),其次要将两种牌分别从大往小 ...

  7. 题解-PKUWC2018 随机游走

    Problem loj2542 题意:一棵 \(n\) 个结点的树,从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去,询问走完一个集合 \(S\)的期望时间,多组询问 \(n\le ...

  8. BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)

    BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...

  9. LOJ2537 PKUWC2018 Minimax 树形DP、线段树合并

    传送门 题意:自己去看 首先可以知道,每一个点都有几率被选到,所以$i$与$V_i$的关系是确定了的. 所以我们只需要考虑每一个值的取到的概率. 很容易设计出一个$DP$:设$f_{i,j}$为在第$ ...

随机推荐

  1. Sqlserver中的触发器

    一 什么是触发器 1.1  触发器的概念   触发器(trigger)是SQL server来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行是由事件来触发,当对一个表进行操作(  ...

  2. Ado.NET基础必备

    一.SqlConnection对象 第一次需要连接数据库时要和服务器握手,解析连接字符串,授权,约束的检查等等操作,而物理连接建立后,这些操作就不会去做了(默认使用了连接池技术). SqlConnec ...

  3. Project facet Java version 1.8 not supported

    把其它的项目到自己的eclipse中后,进行运行项目之后,就会提示为“Project facet Java version 1.8 not supported”.   进行更改配置,进行右键项目就会弹 ...

  4. 【leetcode-73】 矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1],   [1,1,1] ] 输 ...

  5. 【1】【leetcode-79】 单词搜索

    (典型dfs,知道思想写错) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

  6. vue.js 树菜单 递归组件树来实现

    树形视图 Example: https://vuefe.cn/v2/examples/tree-view.html 参照前辈方法实现的,觉得不错,记录一下: 父组件: <!-- 菜单树 --&g ...

  7. Android几个比较有用的插件

    1.Android  Drawable Importer 2.Android ButterKnife Zelezny 使用方法,在SetContentView上右键,Generate 3.Androi ...

  8. lombok注解介绍

    lombok注解介绍 lombok注解文档lombok官网下载 lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法 ...

  9. jqGrid api 中文说明

    JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人b ...

  10. position:fixed 失效

    如果position:fixed 失效,那应该是你设置position的元素的父元素中有设置了transform属性哦 . 把 transform删除或设置为none就可以解决啦. 但是如果trans ...