[loj3043]线段树

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]线段树的更多相关文章
- 【loj3043】【zjoi2019】线段树
题目 描述 有\(m\)个操作一次发生,每个操作有\(\frac{1}{2}\)的概率被执行 ; 一次操作为线段树([1,n])上的 \(modify(Node,l,r,ql,qr)\) ; ...
- 【LOJ3043】「ZJOI2019」线段树
题面 问题可以转化为每次区间覆盖操作有 \(\frac{1}{2}\) 的概率进行,求标记和的期望.于是我们只要求出所有点有标记的概率即可. 我们设 \(f_i\) 表示节点 \(i\) 有标记的概率 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
随机推荐
- Serverless 工程实践 | 零基础上手 Knative 应用
作者|刘宇 前言:Knative 是一款基于 Kubernetes 的 Serverless 框架.其目标是制定云原生.跨平台的 Serverless 编排标准. Knative 介绍 Knative ...
- 题解 Wide Swap
题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \tex ...
- Go语言核心36讲(Go语言基础知识五)--学习笔记
05 | 程序实体的那些事儿(中) 在前文中,我解释过代码块的含义.Go 语言的代码块是一层套一层的,就像大圆套小圆. 一个代码块可以有若干个子代码块:但对于每个代码块,最多只会有一个直接包含它的代码 ...
- Java(24)常用API三
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228417.html 博客主页:https://www.cnblogs.com/testero ...
- MongoDB中如何优雅地删除大量数据
删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求.除了正常的业务需求,我们需要通过这种方式来为数据库"瘦身". 为什么要"瘦身"呢? 表的数据量到达一定 ...
- Java:NIO 学习笔记-3
Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...
- 防止SQL注入总结
1.预编译(占位符)可以很大程度上防止SQL注入 预编译的原理是数据库厂商提供的JAR包中,对参数进行了转义 2.mybatis中,能用# 的地方,不用$,因为#是预编译占位符形式,可以防止SQL注入 ...
- mybatis中的#和$的区别 以及 防止sql注入
声明:这是转载的. mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...
- Scrum Meeting 0429
零.说明 日期:2021-4-29 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分后端管理 ...
- 微信小程序实现上拉和下拉加载更多
在上一篇文章中,我们知道了使用 scroll-view 可以实现上拉加载更多,但是由于 scroll-view 的限制,它无法实现下拉加载更多,这篇文章我们使用 view 组件来实现 上拉和下拉加载更 ...