_bzoj1798 [Ahoi2009]Seq 维护序列seq【线段树 lazy tag】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1798
注意,应保证当前节点维护的值是正确的,lazy tag只是一个下传标记,在下传时应即时更新儿子的维护值,在修改时也应即时更新当前节点的维护值。
#include <cstdio> const int maxn = 100005; int n, mod, a[maxn], m, t1, t2, t3, opr;
struct Node {
int ql, qr;
long long sm, mul, add;
} tree[maxn << 2]; inline void pushup(int p) {
tree[p].sm = (tree[p << 1].sm + tree[p << 1 | 1].sm) % mod;
}
inline void pushdown(int p) {
tree[p << 1].mul = tree[p << 1].mul * tree[p].mul % mod;
tree[p << 1].add = (tree[p << 1].add * tree[p].mul + tree[p].add) % mod;
tree[p << 1].sm = (tree[p << 1].sm * tree[p].mul + tree[p].add * (tree[p << 1].qr - tree[p << 1].ql + 1)) % mod; tree[p << 1 | 1].mul = tree[p << 1 | 1].mul * tree[p].mul % mod;
tree[p << 1 | 1].add = (tree[p << 1 | 1].add * tree[p].mul + tree[p].add) % mod;
tree[p << 1 | 1].sm = (tree[p << 1 | 1].sm * tree[p].mul + tree[p].add * (tree[p << 1 | 1].qr - tree[p << 1 | 1].ql + 1)) % mod; tree[p].mul = 1;
tree[p].add = 0;
}
void make_tree(int p, int left, int right) {
tree[p].ql = left;
tree[p].qr = right;
tree[p].mul = 1;
if (left == right) {
tree[p].sm = (long long)(a[left] % mod);
return;
}
int mid = (left + right) >> 1;
make_tree(p << 1, left, mid);
make_tree(p << 1 | 1, mid + 1, right);
pushup(p);
}
void mull(int p, int left, int right, int c) {
if (tree[p].ql == left && tree[p].qr == right) {
tree[p].mul = tree[p].mul * (long long)c % mod;
tree[p].add = tree[p].add * (long long)c % mod;
tree[p].sm = tree[p].sm * (long long)c % mod;
return;
}
pushdown(p);
int mid = (tree[p].ql + tree[p].qr) >> 1;
if (right <= mid) {
mull(p << 1, left, right, c);
}
else if (left > mid) {
mull(p << 1 | 1, left, right, c);
}
else {
mull(p << 1, left, mid, c);
mull(p << 1 | 1, mid + 1, right, c);
}
pushup(p);
}
void addd(int p, int left, int right, int c) {
if (tree[p].ql == left && tree[p].qr == right) {
tree[p].add = (tree[p].add + (long long)c) % mod;
tree[p].sm = (tree[p].sm + (long long)c * (long long)(tree[p].qr - tree[p].ql + 1)) % mod;
return;
}
pushdown(p);
int mid = (tree[p].ql + tree[p].qr) >> 1;
if (right <= mid) {
addd(p << 1, left, right, c);
}
else if (left > mid) {
addd(p << 1 | 1, left, right, c);
}
else {
addd(p << 1, left, mid, c);
addd(p << 1 | 1, mid + 1, right, c);
}
pushup(p);
}
int qry(int p, int left, int right) {
if (tree[p].ql == left && tree[p].qr == right) {
return (int)tree[p].sm;
}
pushdown(p);
int mid = (tree[p].ql + tree[p].qr) >> 1, rt;
if (right <= mid) {
rt = qry(p << 1, left, right);
}
else if (left > mid) {
rt = qry(p << 1 | 1, left, right);
}
else {
rt = qry(p << 1, left, mid);
rt = (rt + qry(p << 1 | 1, mid + 1, right)) % mod;
}
pushup(p);
return rt;
} int main(void) {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%d%d", &n, &mod);
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
}
make_tree(1, 1, n);
scanf("%d", &m);
while (m--) {
scanf("%d%d%d", &opr, &t1, &t2);
if (opr == 1) {
scanf("%d", &t3);
mull(1, t1, t2, t3);
}
else if (opr == 2) {
scanf("%d", &t3);
addd(1, t1, t2, t3);
}
else {
printf("%d\n", qry(1, t1, t2));
}
}
return 0;
}
_bzoj1798 [Ahoi2009]Seq 维护序列seq【线段树 lazy tag】的更多相关文章
- 【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 老师交给小可可一个维护数列的任务,现在小可 ...
- 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 (线段树 ,多重标记下放)
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 ...
- 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 老师交给小可可一个维护数列的任务,现在小 ...
随机推荐
- ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解
转自 ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解 ArcGIS Engine中总调用IFeatureCla ...
- struts2 自己定义表单
自己定义表单一定会涉及<s:iterator/>迭代,一个复杂的自己定义表单可能会嵌套n多层迭代. 比方一个自己定义一个问卷调查页面涉及3个模型:一个Survey代表一个调查.一个Page ...
- 【Git使用具体解释】Egit的经常使用操作具体解释
经常使用操作 操作 说明 Fetch 从远程获取最新版本号到本地,不会自己主动merge Merge 能够把一个分支标签或某个commit的改动合并如今的分支上 Pull 从远程获取最新版本号并mer ...
- Hadoop-异常-Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/io/DatumReader
//maven org.apache.avr 下载不完全 ,去maven If you are using maven to build your jar, you need to add the ...
- Scala入门到精通——第二十四节 高级类型 (三)
作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Man ...
- Xpath—解决这个问题的良药
何为良药? 因为在XML中存在一些问题和缺陷,针对这些问题就产生了响应的解决方式.如: getElementById方法在解析XML时因为一些原因适不适合的: 首先XML中每一个元素节点不一定有id属 ...
- 用Visual Studio高版本号打开低版本号的project,转换时出现错误:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
解决方法是: 在电脑里面搜索发现 C:\Program Files\Microsoft Visual Studio 10.0\VC\bin C:\Windows\winsxs\x86_netf ...
- enumerateObjectsUsingBlock 、for 、for(... in ...) 的差别 & 性能測试
for VS for(... in ...) for 的应用范围广基本能够NSArray.NSArray以及C语言的数组等,而for(... in ...)仅限于NSArray.NSArray等 fo ...
- sql server 系统常用函数:聚合函数 数学函数 字符串函数 日期和时间函数和自定义函数
一.系统函数 1.聚合函数 聚合函数常用于GROUP BY子句,在SQL Server 2008提供的所有聚合函数中,除了COUNT函数以外,聚合函数都会忽略空值AVG.COUNT.COUNT_BIG ...
- 开源 java CMS - FreeCMS2.2 敏感词管理
项目地址:http://www.freeteam.cn/ 敏感词管理 管理敏感词.系统会自己主动将敏感词替换为指定字符. 系统进行敏感词处理的功能有: 信息:标题.内容,摘要. 栏目:名称,描写叙述. ...