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:$询 ...
随机推荐
- HBase与MongDB等NoSQL数据库对照
HBase概念学习(十)HBase与MongDB等NoSQL数据库对照 转载请注明出处: jiq•钦's technical Blog - 季义钦 一.开篇 淘宝之前使用的存储层架构一直是MySQL数 ...
- Yocto开发笔记之《驱动调试-华为3G模块》(QQ交流群:519230208)
QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ======================================================== 参考:ht ...
- BZOJ4690: Never Wait for Weights
裸带权并查集. #include<cstdio> #define N 100005 int m,i,j,s,t,u,d[N],p[N]; char k; int find(int i){ ...
- 最小路径(prim)算法
#include <stdio.h>#include <stdlib.h>/* 最小路径算法 -->prim算法 */#define VNUM 9#define MV 6 ...
- chmod 和 chown 的用法
一.chown 命令 用途:更改文件的所有者或组.命令由单词change owner组合而成. 使用示例: 1,更改文件的所有者: chown jim program.c 文件 program.c 的 ...
- Spring MVC学习笔记——注解式控制器
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【七】——实现资源的分页
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可 ...
- 二叉排序树(Binary Sort Tree)
参考文章:http://blog.csdn.net/ns_code/article/details/19823463 不过博主的使用第一种方法操作后的树已经不是二叉排序树了,值得深思!! #inclu ...
- [css]通过transform缩放邮件客户端h5页面
摘要 最近一直在折腾邮件通知的东东,大概逻辑就是如果有新邮件,向收件人的app推送一条服务号消息,并且在单击该消息的时候,需要展示邮件的详情. 技术 这里是使用Exchange EWS API来实现的 ...
- Nosql 之 Redis(可做缓存 )
下载 可以下载解压安装的 地址:https://github.com/dmajkic/redis/downloads 修改 redis.conf 取消注释 requirepass foobared运行 ...