[bzoj1798][Ahoi2009]Seq 维护序列seq ([洛谷P3373]【模板】线段树 2)
题目大意:有$n$个数,有$m$个操作,有三种:
- $1\;l\;r\;x:$把区间$[l,r]$内的数乘上$x$
- $2\;l\;r\;x:$把区间$[l,r]$内的数加上$x$
- $3\;l\;r:$询问区间$[l,r]$的和,对$p$取模
(线段树2就是先读入$n\;m\;p$,再读入序列;本题是先读入$n\;p$,读入序列,再读入$m$,双倍经验)
题解:线段树,把$lazy\_tag$变成两个,分别记录区间加和区间乘,注意乘法的优先级比加法高
卡点:无(我以前写的是什么代码啊?)
C++ Code:
#include <cstdio>
#define maxn 100010 << 2
long long V[maxn], cov[maxn], tg[maxn];
int n, m;
int s[maxn], L, R;
long long p, x;
void update(int rt) {
V[rt] = (V[rt << 1] + V[rt << 1 | 1]) % p;
}
void build(int rt, int l, int r) {
cov[rt] = 1;
if (l == r) {
V[rt] = s[l] % p;
return ;
}
int mid = l + r >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
update(rt);
}
void pushdown(int rt, long long len) {
long long &Cov = cov[rt], &Tg = tg[rt];
V[rt << 1] = (V[rt << 1] * Cov + Tg * (len + 1 >> 1)) % p;
V[rt << 1 | 1] = (V[rt << 1 | 1] * Cov + Tg * (len >> 1)) % p;
cov[rt << 1] = (cov[rt << 1] * Cov) % p;
cov[rt << 1 | 1] = (cov[rt << 1 | 1] * Cov) % p;
tg[rt << 1] = (tg[rt << 1] * Cov + Tg) % p;
tg[rt << 1 | 1] = (tg[rt << 1 | 1] * Cov + Tg) % p;
Cov = 1, Tg = 0;
}
void add1(int rt, int l, int r) {
if (L <= l && R >= r) {
V[rt] = (V[rt] * x) % p;
cov[rt] = (cov[rt] * x) % p;
tg[rt] = (tg[rt] * x) % p;
return ;
}
int mid = l + r >> 1;
if (cov[rt] != 1 || tg[rt]) pushdown(rt, r - l + 1);
if (L <= mid) add1(rt << 1, l, mid);
if (R > mid) add1(rt << 1 | 1, mid + 1, r);
update(rt);
}
void add2(int rt, int l, int r) {
if (L <= l && R >= r) {
V[rt] = (V[rt] + x * (r - l + 1ll)) % p;
tg[rt] = (tg[rt] + x) % p;
return ;
}
int mid = l + r >> 1;
if (cov[rt] != 1 || tg[rt]) pushdown(rt, r - l + 1);
if (L <= mid) add2(rt << 1, l, mid);
if (R > mid) add2(rt << 1 | 1, mid + 1, r);
update(rt);
}
long long ask(int rt, int l, int r) {
if (L <= l && R >= r) return V[rt] % p;
int mid = l + r >> 1;
long long ans = 0;
if (cov[rt] != 1 || tg[rt]) pushdown(rt, r - l + 1);
if (L <= mid) ans = ask(rt << 1, l, mid);
if (R > mid) ans = (ans + ask(rt << 1 | 1, mid + 1, r)) % p;
return ans;
}
int main() {
scanf("%d%lld", &n, &p);
for (int i = 1; i <= n; i++) scanf("%d", s + i);
build(1, 1, n);
scanf("%d", &m);
while (m --> 0) {
long long op;
scanf("%lld%d%d", &op, &L, &R);
switch (op) {
case 1: {
scanf("%lld", &x);
add1(1, 1, n);
break;
}
case 2: {
scanf("%lld", &x);
add2(1, 1, n);
break;
}
default: printf("%lld\n", ask(1, 1, n));
}
}
return 0;
}
[bzoj1798][Ahoi2009]Seq 维护序列seq ([洛谷P3373]【模板】线段树 2)的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
随机推荐
- 关于js的严格模式
最近在看你不知道js,补充自己的js基础,加深理解.在读的过程中写点笔记. 严格模式下与非严格模式的区别 . 严格模式是es5新增的,es6是默认为严格模式的!js默认状态下是非严格模式的! 一般 ...
- BZOJ3170: [Tjoi2013]松鼠聚会(切比雪夫距离转曼哈顿距离)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1524 Solved: 803[Submit][Status][Discuss] Descripti ...
- HTTP协议中request报文请求方法和状态响应码
一个HTTP请求报文由4部分组成: 请求行(request line) 请求头部(header) 空行 请求数据 下图给出了请求报文的一般格式: 请求行中包括了请求方法,常见的请求方法有: GET:从 ...
- 精读《12 个评估 JS 库你需要关心的事》
1 引言 作者给出了从 12 个角度全面分析 JS 库的可用性,分别是: 特性. 稳定性. 性能. 包生态. 社区. 学习曲线. 文档. 工具. 发展历史. 团队. 兼容性. 趋势. 下面总结一下作者 ...
- 【Mysql】给mysql配置远程登录
grant all privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option; flush privileges ...
- ES6笔记04-class的基本语法
JavaScript 语言中,生成实例对象的传统方法是通过构造函数. ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类. clas ...
- manjaro无法使用ifconfig查ip
manjaro中自带的查看网络的命令是: ip addr 可以了解一下ip命令都有哪些功能 如果还是想要 ifconfig 需要安装net-tools 安装命令: sudo pacman -S net ...
- poj 2965 枚举+DFS
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 25343 ...
- Cache、Buffer的区别
什么是Cache?什么是Buffer?二者的区别是什么? Buffer和Cache的区别 buffer与cache操作的对象就不一样. 1.buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备) ...
- PHP.TP框架下商品项目的优化4-优化商品添加表单js
优化商品添加表单js 思路 1.制作五个按钮 2.下面五个table 3.全部隐藏,点击则显示 4.点击第几个按钮就显示第几个table 具体操作 1.添加按钮 2.添加五个table并添加class ...