BZOJ 1798: [Ahoi2009]Seq 维护序列seq (线段树乘法加法的混合操作)
题目:点击打开链接
大意:一个数组。三个操作。第一种是区间[a,b]每一个数乘乘,另外一种是区间[a,b]每一个数加c,第三种是查询[a,b]区间的和并对p取摸。
两种操作就不能简单的仅仅往下传标记。每次传乘法标记时。要把加法标记同一时候乘上乘法标记,比如某个区间先进来一个加法标记add。之后又进来一个乘法标记mul。
那么结果为(x + add) * mul = x * mul + add * mul。
这样向下传标记的时候就相对独立。递归边界更新加法标记之前先乘上该节点的mul。左右儿子down的时候先将儿子的add乘上本节点的mul。
最后说一下sum,比方本节点的存在加法标记x和乘法标记y,而且是先加上x,再乘上y,则左儿子的sum要更新为(sum+x)*y。因为乘法标记传到本节点的时候更新了加法标记,x = x*y,所以sum[o<<1] = (左区间的长度*x) + sum[o<<1]*y。
/**************************************************************
Problem: 1798
User: __ElemenT
Language: C++
Result: Accepted
Time:4676 ms
Memory:10184 kb
****************************************************************/ #include <cstdio>
#define lson o<<1, l, m
#define rson o<<1|1, m+1, r
typedef long long LL;
const int maxn = 100005; int n, a, b, c, k, q;
LL sum[maxn<<2], add[maxn<<2], mul[maxn<<2], p; void up(int o) {
sum[o] = (sum[o<<1]+sum[o<<1|1]) %p;
} void build(int o, int l, int r) {
add[o] = 0, mul[o] = 1;
if(l == r) {
scanf("%lld", &sum[o]);
return;
}
int m = (l+r) >> 1;
build(lson);
build(rson);
up(o);
} void down(int o, int len) {
// if(add[o] != 0 && mul[o] != 1) {
add[o<<1] = (add[o<<1] * mul[o] + add[o]) %p;
add[o<<1|1] = (add[o<<1|1] * mul[o] + add[o]) %p;
mul[o<<1] = mul[o<<1] * mul[o] %p;
mul[o<<1|1] = mul[o<<1|1] * mul[o] %p;
sum[o<<1] = (sum[o<<1] * mul[o] + add[o] * (len-(len>>1))) %p;
sum[o<<1|1] = (sum[o<<1|1] * mul[o] + add[o] * (len>>1)) %p;
add[o] = 0, mul[o] = 1;
// }
} void update(int o, int l, int r, int op) {
if(a <= l && r <= b) {
if(op == 1) {
add[o] = add[o]*c %p;
mul[o] = mul[o]*c %p;
sum[o] = sum[o]*c %p;
} else {
add[o] = (add[o] + c) %p;
sum[o] = (sum[o] + (LL)c*(r-l+1)) %p;
}
return;
}
down(o, r-l+1);
int m = (l+r) >> 1;
if(a <= m) update(lson, op);
if(m < b ) update(rson, op);
up(o);
} LL query(int o, int l, int r) {
if(a <= l && r <= b) return sum[o] %p;
down(o, r-l+1);
int m = (l+r) >> 1;
LL ans = 0;
if(a <= m) ans = query(lson);
if(m < b ) ans += query(rson);
return ans %p;
} int main()
{
scanf("%d%lld", &n, &p);
build(1, 1, n);
scanf("%d", &q);
while(q--) {
scanf("%d%d%d", &k, &a, &b);
if(k != 3) {
scanf("%d", &c);
update(1, 1, n, k);
} else printf("%lld\n", query(1, 1, n));
}
return 0;
}
BZOJ 1798: [Ahoi2009]Seq 维护序列seq (线段树乘法加法的混合操作)的更多相关文章
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 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 老师交给小可可一个维护数列的任务,现在小可 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
随机推荐
- opencv边缘滤波
2018-03-0422:16:11 import cv2 as cv import numpy as np def bi_demo (image): print ("ceshi" ...
- NodeJS、NPM安装配置步骤
安装NodeJS和NPM 1.Node JS 官网下载地址 https://nodejs.org/en/download/ 2.安装完后,使用cmd 命令输入两个命令,查看安装状态 node -v n ...
- 关于 . H 宏定义技巧
#ifndef LABEL #define LABEL //代码部分 #endif LABEL为一个唯一的标号,命名规则跟变量的命名规则一样.常根据它所在的头文件名来命名,例如,如果头文件的文 ...
- JSP学习笔记 - 内置对象 Response
1.response.addHeader("refresh","2"): 制定页面刷新时间 2.response.addHeader("refresh ...
- SQL SERVER 2008 在某表中新增一列时失败
背景:新增列语句如:“alter table 表名 add 列名 float default 0 with values”(用VS2010做网站,这句话是在C#代码里执行的) 报错提示: 警告: 已经 ...
- redis的安装和使用【2】redis的java操作
修改redis.conf# 配置绑定ip,作者机子为192.168.100.192,请读者根据实际情况设置bind 192.168.100.192#非保护模式protected-mode no保存重启 ...
- Jmeter之JDBC请求参数化(二)
二.上面已经讲了一些基本的配置,和简单的jdbc请求,下面来看下具体的如何将查询语句参数化. 参数化这里有几种方法,foreach,计数器,csv等,这里介绍几种方法.
- 05JavaScript中的事件处理
JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...
- 转自王垠Blog——写给清华大学的退学申请
清华梦的粉碎—写给清华大学的退学申请(转自王垠Blog) 清华梦的诞生 小时候,妈妈给我一个梦.她指着一个大哥哥的照片对我说,这是爸爸的学生,他考上了清华大学,他是我们中学的骄傲.长大后,你也要进 ...
- <SpringMvc>入门三 参数绑定
1.get请求 <%--请求参数的绑定--%> <%--get请求参数--%> <a href="/param/testParam1?username=tom& ...