考虑把每一个区间单独统计,令$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. 从零入门 Serverless | 一文搞懂函数计算及其工作原理

    作者 | 孔德慧(夏莞) 阿里云函数计算开发工程师 什么是函数计算 大家都了解,Serverless 并不是没有服务器,而是开发者不再需要关心服务器.下图是一个应用从开发到上线的对比图: 在传统 Se ...

  2. Data Interoperability Tools

    这里的工具貌似没有对应函数~~~

  3. 详解build-gradle文件

    目录 gradle 两个build.gradle文件 最外层目录下的build.gradle文件 jcenter dependencies闭包 app目录下的build.gradle文件 com.an ...

  4. 【c++ Prime 学习笔记】第13章 拷贝控制

    定义一个类时,可显式或隐式的指定在此类型对象上拷贝.移动.赋值.销毁时做什么.通过5种成员函数实现拷贝控制操作: 拷贝构造函数:用同类型的另一个对象初始化本对象时做什么(拷贝初始化) 拷贝赋值算符:将 ...

  5. Java只有值传递

    二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...

  6. 类图示例-订单系统 / Class Diagram - Order System

    类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...

  7. NOIP模拟83(多校16)

    前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...

  8. MySQL:提高笔记-3

    MySQL:提高笔记-3 学完基础的语法后,进一步对 MySQL 进行学习,前几篇为: MySQL:提高笔记-1 MySQL:提高笔记-2 MySQL:提高笔记-3,本文 说明:这是根据 bilibi ...

  9. MySQL:基础语法-3

    MySQL:基础语法-3 记录一下 MySQL 基础的一些语法,便于查询,该部分内容主要是参考:bilibili 上 黑马程序员 的课程而做的笔记,由于时间有点久了,课程地址忘记了 上文MySQL:基 ...

  10. virtual box搭建虚拟机nat和host only网络配置实用

    virtual box搭建虚拟机nat和host only网络配置实用 一.背景 二.需求 二.设置虚拟机的网络 1.创建一个全局的nat网络 2.添加主机网络管理器 3.设置虚拟机网络 1.网卡1设 ...