【LOJ】#3043. 「ZJOI2019」线段树
LOJ#3043. 「ZJOI2019」线段树
计数转期望的一道好题……
每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记
被覆盖的点$0.5p + 0.5 \rightarrow p ,0.5q + 0.5\rightarrow q $
被覆盖的点子树中的点\(p\rightarrow p,0.5q + 0.5 \rightarrow q\)
经过的点\(0.5p \rightarrow p,0.5q \rightarrow q\)
未被经过,被pushdown,\(0.5p + 0.5q \rightarrow p,q\rightarrow q\)
根本没事\(p\rightarrow p,q\rightarrow q\)
最后统计\(p\)的和,设操作次数是\(tot\),乘上\(2^{tot}\)即可
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 200005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int l,r,p,q,m,a;
}tr[MAXN * 4];
const int MOD = 998244353;
int N,ans,M,tot;
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void upd(int &x,int y) {
x = inc(x,y);
}
void upm(int &x,int y) {
x = mul(x,y);
}
int fpow(int x,int c) {
int res = 1,t = x;
while(c) {
if(c & 1) res = mul(res,t);
t = mul(t,t);
c >>= 1;
}
return res;
}
void addlz(int u,int m,int a) {
upm(tr[u].m,m);upm(tr[u].a,m);
upd(tr[u].a,a);
upm(tr[u].q,m);upd(tr[u].q,a);
}
void pushdown(int u) {
addlz(u << 1,tr[u].m,tr[u].a);
addlz(u << 1 | 1,tr[u].m,tr[u].a);
tr[u].m = 1;tr[u].a = 0;
}
void build(int u,int l,int r) {
tr[u].l = l;tr[u].r = r;tr[u].a = 0;tr[u].m = 1;
if(l == r) return;
int mid = (l + r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
}
void get_diff(int &x,int y) {
upd(ans,inc(y,MOD - x));
x = y;
}
void Modify(int u,int l,int r) {
if(tr[u].l == l && tr[u].r == r) {
get_diff(tr[u].p,mul(tr[u].p + 1,(MOD + 1) / 2));
addlz(u,(MOD + 1) / 2,(MOD + 1) / 2);
return;
}
get_diff(tr[u].p,mul(tr[u].p,(MOD + 1) / 2));
tr[u].q = mul(tr[u].q,(MOD + 1) / 2);
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if(r <= mid) {
Modify(u << 1,l,r);
get_diff(tr[u << 1 | 1].p,mul((MOD + 1) / 2,inc(tr[u << 1 | 1].p,tr[u << 1 | 1].q)));
}
else if(l > mid) {
Modify(u << 1 | 1,l,r);
get_diff(tr[u << 1].p,mul((MOD + 1) / 2,inc(tr[u << 1].p,tr[u << 1].q)));
}
else {
Modify(u << 1,l,mid);Modify(u << 1 | 1,mid + 1,r);
}
}
void Solve() {
read(N);read(M);
int op,l,r;
build(1,1,N);
for(int i = 1 ; i <= M ; ++i) {
read(op);
if(op == 1) {
read(l);read(r);
++tot;
Modify(1,l,r);
}
else {
out(mul(ans,fpow(2,tot)));enter;
}
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【LOJ】#3043. 「ZJOI2019」线段树的更多相关文章
- @loj - 3043@「ZJOI2019」线段树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...
- Loj #2570. 「ZJOI2017」线段树
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...
- 「ZJOI2019」线段树 解题报告
「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段 ...
- LOJ 3043: 洛谷 P5280: 「ZJOI2019」线段树
题目传送门:LOJ #3043. 题意简述: 你需要模拟线段树的懒标记过程. 初始时有一棵什么标记都没有的 \(n\) 阶线段树. 每次修改会把当前所有的线段树复制一份,然后对于这些线段树实行一次区间 ...
- LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望
原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...
- 「ZJOI2019」线段树
传送门 Description 线段树的核心是懒标记,下面是一个带懒标记的线段树的伪代码,其中 tag 数组为懒标记: 其中函数\(Lson(Node)\)表示\(Node\)的左儿子,\(Rson( ...
- @loj - 2093@ 「ZJOI2016」线段树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Yuuka 遇到了一个题目:有一个序列 a1,a2,..., ...
- 【LOJ3043】「ZJOI2019」线段树
题面 问题可以转化为每次区间覆盖操作有 \(\frac{1}{2}\) 的概率进行,求标记和的期望.于是我们只要求出所有点有标记的概率即可. 我们设 \(f_i\) 表示节点 \(i\) 有标记的概率 ...
- 「模板」 线段树——区间乘 && 区间加 && 区间求和
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...
随机推荐
- 网站快速收录/站点快速收录/seo快排技术/seo快速排名/泛域名快速收录/泛目录快速收录
泛目录技术是目前最快速最有效的办法,增加站点的收录方面,这里推荐莲花泛目录 莲花泛目录,完善的技术支持,代码亲自编写,独立研发.业界领先. (这个是seo关键词,请无视,直接看下面的泛目程序介绍)网站 ...
- Educational Codeforces Round 64 (Rated for Div. 2) A,B,C,D,E,F
比赛链接: https://codeforces.com/contest/1156 A. Inscribed Figures 题意: 给出$n(2\leq n\leq 100)$个数,只含有1,2,3 ...
- Rhel7.4系统部署cobbler
cobbler安装 一.系统信息: [root@openstack ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server releas ...
- django 快速搭建blog(三)
http://www.cnblogs.com/fnng/p/3737964.html 引用自此博客 创建blog的公共部分 从Django的角度看, 一个页面 具有三个典型的组件: 一个模板(temp ...
- HearthBuddy遇奥秘解决方法
https://tieba.baidu.com/g/5808796816 链接: https://pan.baidu.com/s/1NPQTOfxbN_4alP7J-XWuVw 密码: xfj1
- 在HearthRanger中使用Silverfish
I'm new here and have never used this bot before. But a few days ago I tried it and I liked it :) I ...
- ssy-publish
github地址: https://github.com/shangyueyue/ssy-publish 一.安装 npm install ssy-publish -D 二.在process.cwd( ...
- Go项目的测试代码3(测试替身Test Double)
上一篇文章介绍了项目中测试代码的写法. Go项目的测试代码2(项目运用) 这里简单的共享一下测试替身. 当我们写测试代码的时候,经常遇到一个问题.跟别的模块或服务有依赖性,可是功能还没开发完.或是因为 ...
- LC 583. Delete Operation for Two Strings
Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...
- C# WinForm设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框
1)窗口去除边框 在组件属性中FormBorderStyle设为None 2)窗口随着鼠标移动而动 添加引用using System.Runtime.InteropServices; 在初始化控件{I ...