题面

题解

强势安利一波巨佬的$blog$

线段树合并吼题啊

合并的时候要记一下$A$点权值小于$l$的概率和$A$点权值大于$r$的概率,对$B$点同样做

时空复杂度$\text O(nlogw)$,$w$为其中权值的最大值

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x))

inline int read()
{
	int data = 0, w = 1; char ch = getchar();
	while(ch != '-' && (!isdigit(ch))) ch = getchar();
	if(ch == '-') w = -1, ch = getchar();
	while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
	return data * w;
}

const int Mod(998244353), Inv(796898467), maxn(300010), LIM((1 << 30) - 1);
inline int Add(int a, int b) { return (a + b) % Mod; }
int ans, cnt, son[2][maxn * 20], tag[maxn * 20], P[maxn * 20], cur, root[maxn];

inline int newNode()
{
	tag[++cur] = 1; P[cur] = 0;
	son[0][cur] = son[1][cur] = 0;
	return cur;
}

inline void pushup(int x) { P[x] = Add(P[son[0][x]], P[son[1][x]]); }
inline void put_tag(int x, int p)
{
	if(!x) return;
	tag[x] = 1ll * tag[x] * p % Mod;
	P[x] = 1ll * P[x] * p % Mod;
}

inline void pushdown(int x)
{
	put_tag(son[0][x], tag[x]);
	put_tag(son[1][x], tag[x]);
	tag[x] = 1;
}

void calc(int x, int l = 0, int r = LIM)
{
	if(!x) return;
	if(l == r)
	{
		++cnt; ans = Add(ans, 1ll * cnt * P[x] % Mod * P[x] % Mod * l % Mod);
		return;
	}
	pushdown(x);
	int mid = (l + r) >> 1;
	calc(son[0][x], l, mid);
	calc(son[1][x], mid + 1, r);
}

void insert(int &x, int id, int l = 0, int r = LIM)
{
	if(!x) x = newNode();
	tag[x] = P[x] = 1;
	if(l == r) return;
	int mid = (l + r) >> 1;
	if(id <= mid) insert(son[0][x], id, l, mid);
	else insert(son[1][x], id, mid + 1, r);
}

int S[2][maxn], tot[maxn], W[maxn], n;
int merge(int a, int b, int pa, int pb, int pmax)
{
	if(!a && !b) return 0;
	if(!a) return put_tag(b, pa), b;
	if(!b) return put_tag(a, pb), a;
	pushdown(a), pushdown(b);
	int pal = Add(pa, 1ll * P[son[1][a]] * Add(Mod - pmax, 1) % Mod),
		pbl = Add(pb, 1ll * P[son[1][b]] * Add(Mod - pmax, 1) % Mod),
		par = Add(pa, 1ll * P[son[0][a]] * pmax % Mod),
		pbr = Add(pb, 1ll * P[son[0][b]] * pmax % Mod);
	son[0][a] = merge(son[0][a], son[0][b], pal, pbl, pmax);
	son[1][a] = merge(son[1][a], son[1][b], par, pbr, pmax);
	return pushup(a), a;
}

void dfs(int x)
{
	if(!tot[x]) return (void) (insert(root[x], W[x]));
	W[x] = 1ll * W[x] * Inv % Mod;
	for(RG int i = 0; i < tot[x]; i++) dfs(S[i][x]);
	if(tot[x] == 1) root[x] = root[S[0][x]];
	else root[x] = merge(root[S[0][x]], root[S[1][x]], 0, 0, W[x]);
}

int main()
{
#ifndef ONLINE_JUDGE
	file(cpp);
#endif
	n = read();
	for(RG int i = 1, fa; i <= n; i++)
		fa = read(), S[tot[fa]++][fa] = i;
	for(RG int i = 1; i <= n; i++) W[i] = read();
	dfs(1); calc(root[1]); printf("%d\n", ans);
	return 0;
}

「PKUWC2018」Minimax的更多相关文章

  1. loj#2537. 「PKUWC2018」Minimax

    题目链接 loj#2537. 「PKUWC2018」Minimax 题解 设\(f_{u,i}\)表示选取i的概率,l为u的左子节点,r为u的子节点 $f_{u,i} = f_{l,i}(p \sum ...

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

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

  3. loj2537 「PKUWC2018」Minimax 【概率 + 线段树合并】

    题目链接 loj2537 题解 观察题目的式子似乎没有什么意义,我们考虑计算出每一种权值的概率 先离散化一下权值 显然可以设一个\(dp\),设\(f[i][j]\)表示\(i\)节点权值为\(j\) ...

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

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

  5. LOJ2537. 「PKUWC2018」Minimax [DP,线段树合并]

    传送门 思路 首先有一个\(O(n^2)\)的简单DP:设\(dp_{x,w}\)为\(x\)的权值为\(w\)的概率. 假设\(w\)来自\(v1\)的子树,那么有 \[ dp_{x,w}=dp_{ ...

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

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

  7. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

  8. 「PKUWC2018」猎人杀

    「PKUWC2018」猎人杀 解题思路 首先有一个很妙的结论是问题可以转化为已经死掉的猎人继续算在概率里面,每一轮一直开枪直到射死一个之前没死的猎人为止. 证明,设所有猎人的概率之和为 \(W\) , ...

  9. LOJ3044. 「ZJOI2019」Minimax 搜索

    LOJ3044. 「ZJOI2019」Minimax 搜索 https://loj.ac/problem/3044 分析: 假设\(w(1)=W\),那么使得这个值变化只会有两三种可能,比\(W\)小 ...

随机推荐

  1. 原生js模仿jq fadeIn fadeOut效果 兼容IE低版本

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. h5标签

    1.<abbr> 标签指示简称或缩写,比如 "WWW" 或 "NATO". IE 6 或更早版本的 IE 浏览器不支持 <abbr> 标 ...

  3. Vuex、Flux、Redux、Redux-saga、Dva、MobX

    https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...

  4. BZOJ1259:[CQOI2007]矩形rect(DFS)

    Description 给一个a*b矩形,由a*b个单位正方形组成.你需要沿着网格线把它分成分空的两部分,每部分所有格子连通,且至少有一个格子在原矩形的边界上.“连通”是指任两个格子都可以通过水平或者 ...

  5. [Python 多线程] Timer定时器/延迟执行、Event事件 (七)

    Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...

  6. js中this应用

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...

  7. 使用Jwt为.Net Core SignalR保驾护航

    前言 SignalR Demo搭建起来之后,是没有相应的认证和授权功能的.于是乎,参考官方文档实现了相应的逻辑. 简单认证 首先使用稍微简单的方式实现.添加如下代码: services.AddAuth ...

  8. PAT——1019. 数字黑洞

    给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字黑洞”之称的6174 ...

  9. Jmeter测试实例

    说明:测试某系统登陆功能,登陆中的验证码已被屏蔽,辅助工具Firebug. 1.打开被测系统准备好firebug,准备抓包登陆操作:

  10. iOS 关闭图片渲染

    在为Button 设置背景图片的时候, 会发现显示的效果和UI给的图片不一样, 往往是把图片显示成为蓝色, 这是因为在新版的iOS中, 会自动对图片渲染. 我们只要把图片渲染关掉就OK了 - (UII ...