首页 技术 正文
技术 2022年11月14日
0 收藏 719 点赞 4,096 浏览 2206 个字

题面

题解

强势安利一波巨佬的$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_JUDGEfile(cpp);#endifn = 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;}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295