考虑把每一个区间单独统计,令$f[i]$表示第i个区间有标记的次数,$g[i]$表示第i个区间及其祖先中存在标记的次数,然后对于操作将所有区间分为5类(T为已执行操作个数):
1.被修改,那么$f[i]+=2^{T}$,$g[i]+=2^{T}$(定义修改为执行了$tag=1$)
2.被经过,$f[i]$和$g[i]$都不变(定义经过为执行了pushdown操作)
3.其父亲被经过且自己没有被修改或经过,那么$f[i]+=g[i]$,$g[i]*=2$
4.在被打上标记的点的子树内(不包括被标记点),那么$f[i]*=2$,$g[i]+=2^{T}$
5.不属于以上任何一类,$f[i]*=2$,$g[i]*=2$
维护线段树,123都属于单点修改,45需要区间修改,维护懒标记$(x,y,z)$表示$f[i]=f[i]*x$,$g[i]=g[i]*y+z$,再维护f的和来支持询问即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 800005
4 #define mod 998244353
5 #define L (k<<1)
6 #define R (L+1)
7 #define mid (l+r>>1)
8 struct ji{
9 int x,y,z;
10 }tag[N];
11 int n,m,T,p,l,r,f[N],g[N],sum[N];
12 void upd(int k,ji x){
13 f[k]=1LL*f[k]*x.x%mod;
14 sum[k]=1LL*sum[k]*x.x%mod;
15 g[k]=(1LL*g[k]*x.y+x.z)%mod;
16 tag[k]=ji{1LL*tag[k].x*x.x%mod,1LL*tag[k].y*x.y%mod,(1LL*tag[k].z*x.y+x.z)%mod};
17 }
18 void down(int k,int l,int r){
19 upd(L,tag[k]);
20 upd(R,tag[k]);
21 tag[k]=ji{1,1,0};
22 }
23 void update(int k,int l,int r,int x,int y){
24 if (l!=r)down(k,l,r);
25 if ((l>y)||(x>r)){
26 f[k]=(f[k]+g[k])%mod;
27 g[k]=g[k]*2%mod;
28 upd(L,ji{2,2,0});
29 upd(R,ji{2,2,0});
30 sum[k]=(0LL+sum[L]+sum[R]+f[k])%mod;
31 return;
32 }
33 if ((x<=l)&&(r<=y)){
34 f[k]=(f[k]+T)*(mod+1LL)/2%mod;
35 sum[k]=(0LL+sum[L]+sum[R]+f[k])%mod;
36 upd(k,ji{2,1,T});
37 return;
38 }
39 update(L,l,mid,x,y);
40 update(R,mid+1,r,x,y);
41 sum[k]=(0LL+sum[L]+sum[R]+f[k])%mod;
42 }
43 int main(){
44 scanf("%d%d",&n,&m);
45 T=1;
46 for(int i=1;i<N-4;i++)tag[i]=ji{1,1,0};
47 for(int i=1;i<=m;i++){
48 scanf("%d",&p);
49 if (p==2)printf("%d\n",sum[1]);
50 else{
51 scanf("%d%d",&l,&r);
52 update(1,1,n,l,r);
53 T=2LL*T%mod;
54 }
55 }
56 }

[loj3043]线段树的更多相关文章

  1. 【loj3043】【zjoi2019】线段树

    题目 描述 ​ 有\(m\)个操作一次发生,每个操作有\(\frac{1}{2}\)的概率被执行 ; ​ 一次操作为线段树([1,n])上的 \(modify(Node,l,r,ql,qr)\) ; ...

  2. 【LOJ3043】「ZJOI2019」线段树

    题面 问题可以转化为每次区间覆盖操作有 \(\frac{1}{2}\) 的概率进行,求标记和的期望.于是我们只要求出所有点有标记的概率即可. 我们设 \(f_i\) 表示节点 \(i\) 有标记的概率 ...

  3. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  4. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  5. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  6. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  7. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  8. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  9. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

随机推荐

  1. PHP审计之POP链挖掘

    PHP审计之POP链挖掘 前言 续上文中的php反序列化,继续来看,这个POP的挖掘思路.在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限.没有进展,随后找到了一个别的师傅已经实现好的项 ...

  2. 超详细的Eureka源码解析

    Eureka简介 Eureka是什么? Eureka是基于REST(Representational State Transfer)服务,主要以AWS云服务为支撑,提供服务发现并实现负载均衡和故障转移 ...

  3. VS 调试 提示 Lc.exe已退出 代码为-1问题解决方法

    找到程序项目下Properties文件夹licenses.licx文件,然后右键选择删除就可以了,调试运行正常了 https://jingyan.baidu.com/article/b24f6c822 ...

  4. gin 跨域问题

    package middlewares import ( "github.com/gin-gonic/gin" "net/http" ) func Cors() ...

  5. Python读取Excel表格

    前言:需要进行自动化办公或者自动化测试的朋友,可以了解下此文,掌握Python读取Excel表格的方法. 一.准备工作: 1.安装Python3.7.0(官网下载安装包) 2.安装Pycharm(官网 ...

  6. Solon 框架如何方便获取每个请求的响应时间?

    经常会有同学问 Solon 怎样才能获取每个请求的响应时间?要求是不需要给每个函数加注解.故此,整理了一下. 不给每个函数加注解,主要有两种方式可以获取请求响应时间: 方式1:基于全局过滤器 Solo ...

  7. UE4蓝图AI角色制作(六)之行为树

    13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...

  8. I-Base62

    I - Base62 PS:一个任意进制转换的大数问题 传送门:Base62 短除法原理: 20(10进制) => 202(3进制) 20 = (2 * 3 ^ 2 + 0 * 3 ^ 1 + ...

  9. CentOS 用户与群组

    目录 1.用户管理 1.1.切换用户 1.2.添加用户 1.3.删除用户 1.4.修改用户 2.群组管理 2.1.查看群组 2.2.添加群组 2.3.删除群组 2.4.修改群组 1.用户管理 Linu ...

  10. 【UE4 C++】UGameplayStatics 源代码

    // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" # ...