【LOJ3043】「ZJOI2019」线段树
问题可以转化为每次区间覆盖操作有 \(\frac{1}{2}\) 的概率进行,求标记和的期望。于是我们只要求出所有点有标记的概率即可。
我们设 \(f_i\) 表示节点 \(i\) 有标记的概率, \(g_i\) 表示节点 \(i\) 的祖先节点有标记的概率。如果一个节点未完全被包含,那么其未被包含的节点是否有标记取决于其祖先节点是否有标记,故要用来自祖先节点的信息来更新答案(设未包含的节点为 \(j\) ,那么 \(f_j \leftarrow \frac{f_j+g_j}{2}\) )。如果一个节点被完全包含,那么 \(f_i \leftarrow \frac{f_i+1}{2}\) ,其所有子节点(包括自己) \(g_j \leftarrow \frac{g_j+1}{2}\) ; 否则因为当前到达的区间标记已被下传,所以 \(f_i\leftarrow \frac{f_i}{2}, g_i\leftarrow \frac{g_i}{2}\) 。 线段树维护 \(f_i,g_i\) , \(g_i\) 的维护需要打标记。
#include<cstdio>
#include<cassert>
inline int gi()
{
	char c=getchar(); int x=0;
	for(;c<'0'||c>'9';c=getchar());
	for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
	return x;
}
const int N=2e5+5,Mod=998244353,inv=Mod+1>>1;
int n,m,f[N<<2],g[N<<2],sum[N<<2],tg1[N<<2],tg2[N<<2],fm=1;
#define lx (x<<1)
#define rx (x<<1|1)
#define mul(x,y) (1ll*(x)*(y)%Mod)
#define div2(x) (1ll*(x)*inv%Mod)
void pushdown(int x)
{
	if(tg1[x]==1&&tg2[x]==0) return ;
	tg1[lx]=mul(tg1[lx],tg1[x]),tg1[rx]=mul(tg1[rx],tg1[x]);
	tg2[lx]=(mul(tg2[lx],tg1[x])+tg2[x])%Mod;
	tg2[rx]=(mul(tg2[rx],tg1[x])+tg2[x])%Mod;
	g[lx]=(mul(g[lx],tg1[x])+tg2[x])%Mod;
	g[rx]=(mul(g[rx],tg1[x])+tg2[x])%Mod;
	tg1[x]=1,tg2[x]=0;
}
void solve(int x)
{
	f[x]=div2((f[x]+g[x])%Mod);
	sum[x]=((sum[lx]+sum[rx])%Mod+f[x])%Mod;
}
void update(int x, int l, int r, int sl, int sr)
{
	if(sl<=l&&r<=sr)
	{
		f[x]=div2(f[x]+1);
		g[x]=div2(g[x]+1);
		sum[x]=((sum[lx]+sum[rx])%Mod+f[x])%Mod;
		tg1[x]=div2(tg1[x])%Mod;
		tg2[x]=(div2(tg2[x])+inv)%Mod;
		return ;
	}
	pushdown(x);
	f[x]=div2(f[x]),g[x]=div2(g[x]);
	int mid=l+r>>1;
	if(sl>mid)
		update(rx,mid+1,r,sl,sr),solve(lx);
	else if(sr<=mid)
		update(lx,l,mid,sl,sr),solve(rx);
	else update(lx,l,mid,sl,sr),update(rx,mid+1,r,sl,sr);
	sum[x]=((sum[lx]+sum[rx])%Mod+f[x])%Mod;
}
int main()
{
	n=gi(),m=gi();
	for(int i=1;i<=(n<<2);++i) tg1[i]=1;
	while(m--)
	{
		int op=gi();
		if(op==2) printf("%d\n",1ll*fm*sum[1]%Mod);
		else
		{
			fm=2ll*fm%Mod;
			int l=gi(),r=gi();
			update(1,1,n,l,r);
		}
	}
}
												
											【LOJ3043】「ZJOI2019」线段树的更多相关文章
- 【LOJ】#3043. 「ZJOI2019」线段树
		
LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...
 - 「ZJOI2019」线段树 解题报告
		
「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段 ...
 - LOJ 3043: 洛谷 P5280: 「ZJOI2019」线段树
		
题目传送门:LOJ #3043. 题意简述: 你需要模拟线段树的懒标记过程. 初始时有一棵什么标记都没有的 \(n\) 阶线段树. 每次修改会把当前所有的线段树复制一份,然后对于这些线段树实行一次区间 ...
 - 「ZJOI2019」线段树
		
传送门 Description 线段树的核心是懒标记,下面是一个带懒标记的线段树的伪代码,其中 tag 数组为懒标记: 其中函数\(Lson(Node)\)表示\(Node\)的左儿子,\(Rson( ...
 - @loj - 3043@「ZJOI2019」线段树
		
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...
 - 「模板」 线段树——区间乘 && 区间加 && 区间求和
		
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...
 - Loj #2570. 「ZJOI2017」线段树
		
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...
 - @loj - 2093@ 「ZJOI2016」线段树
		
目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Yuuka 遇到了一个题目:有一个序列 a1,a2,..., ...
 - 「ZJOI2019」&「十二省联考 2019」题解索引
		
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
 
随机推荐
- swoole 父子进程间通信
			
<?php /** * 场景: * 监控订单表状态 父子进程通信 * 一个主进程 两个子进程实现 */ //设置主进程名 echo '主进程id:' . posix_getpid() . PHP ...
 - Atcoder Beginning Contest 134E(二分查找(upper_bound),思维)
			
#include<bits/stdc++.h>using namespace std;int a[100007],f[100007],ans,n;int main(){ cin>&g ...
 - 监听EditView中的文本改变事件详解--转
			
转自: http://blog.csdn.net/zoeice/article/details/7700529 android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面 ...
 - Python 面试问答基础篇
			
1. Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对 ...
 - python 基础之浅拷贝与深拷贝
			
浅拷贝与深拷贝 1.普通赋值 例1: a = 15b = aa = 16print(b)#例2:lst1 = [1,2,3]lst2 = lst1lst1.append(4)print(lst2)#这 ...
 - UniGui安装(01)
			
UniGui安装.Delphi10和uniGUI1.90.0.1509 1]下载 2]安装 3]目录说明 1]下载 在我百度网盘里 uniGUI1-90-0-1509.zip https://pan ...
 - 在WAMP环境下搭建ZendDebugger php调试工具的方法
			
东西不是新货,所以介绍就不做介绍了,下面主要是配置流程. 首先,下载ZendDebugger,下载链接:http://downloads.zend.com/pdt/server-debugger/,因 ...
 - python读取文件用b模式读取
			
f = open('aaa','rb') 返回的是字节 字符串编码 python中所有的字符串编码为Unicode,如果从一个文件读取字符串,那么该字符串的编码就是该文件的编码. f.tell( ...
 - Kali环境使用Metasploit生成木马入侵安卓手机
			
Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,代码审计, ...
 - IDEA JSP中报错cannot resolve method println的解决方案
			
原因是没有导入Tomcat 库, 在 Project structure 添加