题面

问题可以转化为每次区间覆盖操作有 \(\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」线段树的更多相关文章

  1. 【LOJ】#3043. 「ZJOI2019」线段树

    LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...

  2. 「ZJOI2019」线段树 解题报告

    「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段 ...

  3. LOJ 3043: 洛谷 P5280: 「ZJOI2019」线段树

    题目传送门:LOJ #3043. 题意简述: 你需要模拟线段树的懒标记过程. 初始时有一棵什么标记都没有的 \(n\) 阶线段树. 每次修改会把当前所有的线段树复制一份,然后对于这些线段树实行一次区间 ...

  4. 「ZJOI2019」线段树

    传送门 Description 线段树的核心是懒标记,下面是一个带懒标记的线段树的伪代码,其中 tag 数组为懒标记: 其中函数\(Lson(Node)\)表示\(Node\)的左儿子,\(Rson( ...

  5. @loj - 3043@「ZJOI2019」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...

  6. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  7. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  8. @loj - 2093@ 「ZJOI2016」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Yuuka 遇到了一个题目:有一个序列 a1,a2,..., ...

  9. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

随机推荐

  1. 【转】How to create a test plan

    What is a Test Plan? A TEST PLAN is a detailed document that describes the test strategy, objectives ...

  2. 李德胜系列——李德胜和CPC人的初心

    很久很久以前,有三条恶龙盘踞着村庄,恶龙们及其爪牙对村民敲骨吸髓,逼着村民卖儿鬻女.苦不堪言.但是村民们却对此压迫习以为常,逆来顺受. 后来,一个书生来到了这个村庄,告诉村民,不许跪,也没有人值得他们 ...

  3. [转]Java——Servlet的配置和测试

    本文转自:http://blog.csdn.net/makefish/article/details/6904807 本文以一个实例介绍如何用Java开发Servlet. 主要内容有: 配置和验证To ...

  4. PostgreSQL存取jsonb

    从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型,也就是和varchar.int一样,我们表里的一个字段的类型可以为json了. 与此同时,postgres还提供了j ...

  5. js加密(十一)yhz566 md5

    1. http://www.yhz566.com/ 2. 登录加密 3. navigator = {}; var rng_psize = 256; var b64map = "ABCDEFG ...

  6. 138、Java内部类之访问内部类的私有属性

    01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; class ...

  7. 133、Java获取main主函数参数

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. java连接sql server 2008

    请先确保已经设置好了sa,如果不是,可以参照下面链接修改http://jingyan.baidu.com/article/8cdccae9452b3c315513cd52.html 然后重启数据库,重 ...

  9. 实变函数(Real Analysis)

    针对实数函数的分析理论 首先引入集合和映射的概念 ------------------------------------- 集合交,并,差. 集合的势:有限集,无限集(可列,不可列) 再考虑实数点集 ...

  10. keep-alive 用法 及activated,deactivated这两个生命周期函数

    keep-aliveProps: include - 字符串或正则表达式.只有名称匹配的组件会被缓存.exclude - 字符串或正则表达式.任何名称匹配的组件都不会被缓存.max - 数字.最多可以 ...