【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 ...
随机推荐
- ubuntu配置pip3以及scrapy
.安装支持pip3 sudo apt-get install python3-pip .安装scrapy 首先需要安装scrapy依赖项,否则scrapy安装失败,执行如下命令: sudo apt-g ...
- codeforces316E3
Summer Homework CodeForces - 316E3 By the age of three Smart Beaver mastered all arithmetic operatio ...
- 测试Promise与Async/await的基本使用
想在项目中用, 发现自己不是很熟 promise基本使用 基本使用-思路 new Promise()返回了一个状态机 一个完全无法被外界影响的状态机 构造函数, 传入一个函数, 两个参数, 分别是re ...
- Python选择指定文件夹的文件然后复制出其中几个文件到新的文件夹
""" 要求: 1.读取cdm文件的所有子文件夹,然后每个文件夹里面是抽出一个一个mp3后缀的文件. 遍历所有的子文件,然后将这些mp3文件,保存到一个新的文件夹.文件夹 ...
- docker安装redis,并用配置启动
1.拉取redis镜像 docker pull redis 2.创建redis本地配置文件 ①.去redis官网下载redis,获取redis.conf文件 ②.修改redis.conf文件相关配置, ...
- php多线程的概念
来源:http://www.cnblogs.com/zhenbianshu/p/7978835.html 多线程 线程 首先说下线程: 线程(thread) 是操作系统能够进行运算调度的最小单位.它被 ...
- Maven-导入本地 Jar 包
一个 Jar 包 <dependency> <groupId>local</groupId> <artifactId>aliyun-java-sdk-c ...
- Vue UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例
Vue UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例 element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于Vue和WeUI的组件库 ...
- js内存空间及this关键词详解
http://mp.weixin.qq.com/s/FYFepXmkzzDYNLKhpovYFA
- Hibernate3核心API使用
public static void main(String[] args) throws Exception{ // 1. 加载默认的hibernate.cfg.xml的配置文件 Configura ...