题面

问题可以转化为每次区间覆盖操作有 \(\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. kafka 副本同步细节

    图片来源:咕泡学院

  2. 为kubernetes-dashboard页面增加过期时间,减少登录次数.

    方法很多,最简单的就是登录后,找到Deployments 服务, 右侧界面会出现kubernetes-dashboard的项目,如果没出现,那么在namespace那里选择全部名称空间. ports: ...

  3. 用Total Commander替换windos默认资源管理器的方法

    Total Commander(简称TC)是一个功能强大的资源管理器. TC本身没有自带的替换windows资源管理器的功能,就必须自己动手解决了. 第一步先Google一下看有没有答案.当时搜出了不 ...

  4. python语言入门

    1.python语言是一种高级的脚本语言,诞生于1991年. 2.python是目前主流的编程语言,具有超高的人气,是因为它是目前大数据与人工智能的语言基础,应用范围非常广泛. 3.python语言是 ...

  5. JuJu团队1月10号工作汇报

    JuJu团队1月10号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 飞飞 fix出现的bug -- 无 婷婷 完善main.jl 训练流程 -- 无 恩升 绘图 -- 无 金 ...

  6. ch4 背景图像基础

    如果希望网站有一个好看的背景,只需将背景应用于主体元素,即在body上应用background-image,默认情况下浏览器水平和垂直的重复显示背景图像,让图像平铺在整个页面上,可以选择背景图像是垂直 ...

  7. 「CF1039D」You Are Given a Tree

    传送门 Luogu 解题思路 整体二分. 的确是很难看出来,但是你可以发现输出的答案都是一些可以被看作是关键字处于 \([1, n]\) 的询问,而答案的范围又很显然是 \([0, n]\),这不就刚 ...

  8. php 实现店铺装修7

    type_id=0的情况 type_id=1的情况                         type_id=2的情况 /** * @title 店铺装修--商品分类 * @param type ...

  9. MyEclipse 8.6.1 制作绿色版

    我们先在这个目录下新建一个文件: MyEclipse 10.6.bat , 文件内容如下: start eclipse\eclipse.exe -vm jre\bin\javaw.exe 接下来只需要 ...

  10. leetcode236 Lowest Common Ancestor of a Binary Tree

    """ Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in ...