BZOJ1798——[Ahoi2009]Seq维护序列seq
1、题目大意:区间修改乘法操作和加法操作,求区间和
2、分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义为乘法先,加法后吧。。。那个一个区间的标记无非就是乘a加b,那么重点就是如何下传标记了。首先儿子有两个标记c,d,父亲有两个标记a,b, 那么c就等于c乘a啦,而d等于d乘a加b(从操作的先后顺序考虑)很显然吧。于是问题就解决了
3、代码:( 当时的线段树姿势丑陋,求轻喷
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
struct segment_tree{
LL N, P;
LL sum[1000000];
LL clazy[1000000];
LL jlazy[1000000];
LL value[1000000];
LL x, y, z;
void build(LL l, LL r, LL o){
if(l == r){
clazy[o] = 1;
jlazy[o] = 0;
sum[o] = value[l];
return;
}
int mid = (l + r) / 2;
build(l, mid, 2 * o);
build(mid + 1, r, 2 * o + 1);
sum[o] = sum[2 * o] + sum[2 * o + 1]; sum[o] %= P;
clazy[o] = 1;
jlazy[o] = 0;
return;
}
void updata(LL l, LL r, LL o){
clazy[2 * o] *= clazy[o]; clazy[2 * o] %= P;
jlazy[2 * o] *= clazy[o]; jlazy[2 * o] %= P;
jlazy[2 * o] += jlazy[o]; jlazy[2 * o] %= P;
clazy[2 * o + 1] *= clazy[o]; clazy[2 * o + 1] %= P;
jlazy[2 * o + 1] *= clazy[o]; jlazy[2 * o + 1] %= P;
jlazy[2 * o + 1] += jlazy[o]; jlazy[2 * o + 1] %= P;
sum[o] = sum[o] * clazy[o] + jlazy[o] * (r - l + 1); sum[o] %= P;
clazy[o] = 1;
jlazy[o] = 0;
return;
}
void add_c(LL l, LL r, LL o){
updata(l, r, o);
if(x > r || y < l) return;
if(x <= l && r <= y){
clazy[o] = z;
updata(l, r, o);
return;
}
LL mid = (l + r) / 2;
add_c(l, mid, 2 * o);
add_c(mid + 1, r, 2 * o + 1);
sum[o] = sum[2 * o] + sum[2 * o + 1]; sum[o] %= P;
return;
}
void add_j(LL l, LL r, LL o){
updata(l, r, o);
if(x > r || y < l) return;
if(x <= l && r <= y){
jlazy[o] = z;
updata(l, r, o);
return;
}
LL mid = (l + r) / 2;
add_j(l, mid, 2 * o);
add_j(mid + 1, r, 2 * o + 1);
sum[o] = sum[2 * o] + sum[2 * o + 1]; sum[o] %= P;
return;
}
LL query(LL l, LL r, LL o){
updata(l, r, o);
if(x > r || y < l) return 0;
if(x <= l && r <= y) return sum[o];
LL mid = (l + r) / 2;
LL ret = 0;
ret += query(l, mid, 2 * o); ret %= P;
ret += query(mid + 1, r, 2 * o + 1); ret %= P;
sum[o] = sum[2 * o] + sum[2 * o + 1]; sum[o] %= P;
return ret;
}
} wt;
int main(){
scanf("%lld%lld", &wt.N, &wt.P);
for(LL i = 1; i <= wt.N; i ++){
scanf("%lld", &wt.value[i]);
}
wt.build(1, wt.N, 1);
LL q;
scanf("%lld", &q);
while(q --){
LL a;
scanf("%lld", &a);
if(a == 1){
scanf("%lld%lld%lld", &wt.x, &wt.y, &wt.z);
wt.add_c(1, wt.N, 1);
}
else if(a == 2){
scanf("%lld%lld%lld", &wt.x, &wt.y, &wt.z);
wt.add_j(1, wt.N, 1);
}
else if(a == 3){
scanf("%lld%lld", &wt.x, &wt.y);
printf("%lld\n", wt.query(1, wt.N, 1));
}
}
return 0;
}
BZOJ1798——[Ahoi2009]Seq维护序列seq的更多相关文章
- 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)把数列中的一 ...
- 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq
分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...
- [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:$询 ...
随机推荐
- CSS 中如何把 Span 标签设置为固定宽度
一.形如<span>ABC</span>独立行设置SPAN为固定宽度方法如下: span {width:60px; text-align:center; display:blo ...
- 记一次DDos攻击--2016/12/8
先上图 图一 图二 午休之后~ 睡意朦胧,报警来了.看到121121Mbps的流量攻击,精神一震. 不到两秒,又来了一个短信,开始心塞.网站入口IP被封了.打开网站,全站瘫痪.紧接着运营就来了,让运营 ...
- 自然语言16.1_Python自然语言处理学习笔记之信息提取步骤&分块(chunking)
QQ:231469242 欢迎喜欢nltk朋友交流 http://www.cnblogs.com/undercurrent/p/4754944.html 一.信息提取模型 信息提取的步骤共分为五步,原 ...
- Python学习笔记——基本语法
1.程序输出——print语句 >>> myString = 'Hello World!' >>> print myString Hello World! > ...
- JAVA属性和成员的可见性
- 表达式拼接Expression<Func<IEntityMapper, bool>> predicate
/// <summary> /// 重写以筛选出当前上下文的实体映射信息 /// </summary> protected override IEnumerable<IE ...
- yum -y install与yum install有什么不同
yum -y install 包名(支持*) :自动选择y,全自动 yum install 包名(支持*) :手动选择y or n yum remove 包名(不支持*) rpm -ivh 包名(支持 ...
- Linux下删除命令
linux删除目录很简单 使用rm -rf命令即可.直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字(警告:不作任何提示,且不可恢复,不要说没提醒哦!严重警告!!!)-r 就是向下 ...
- PHPCMS 模板制作标签
内容模块: 栏目调用1: {pc:content action="category" catid="0" num="25" siteid=& ...
- HDInsight 指定输出目录 insert overwrite
基本语法 insert overwrite local directory '/example/demo/' select * from table; 可以格式化输出 insert overwrite ...