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-论css如何纯代码实现内凹圆角
background-image: radial-gradient(200px at 50px 0px, #fff 50px, #4169E1 50px); 这是做内凹圆角的核心代码,就是背景图的ra ...
- JS-Date对象
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>D ...
- su su- sudo的区别
linux su命令参数及用法详解(linux切换用户命令) su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码 linux su 命令 建议大家切换用户的时候 使用 su ...
- CentOS系统rsync文件同步 安装配置
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync 它的特性如下: 可以镜像保存整个目录树和文件系统. 可以很容易做到保持原来文件的权限.时间.软硬 ...
- ecshop新增一个编辑器
在ecshop的后台新增一个编辑器框 步骤一:找到lib_main.php 文件:admin/includes/lib_main.php. 找到变量:function create_html_edit ...
- asp.net 中的app_offline.htm的使用
前段时间,系统升级,由于系统更新发布时间较长,所以必须停掉站点进行更新.导致很多用户都来反馈系统无法访问,还认为站点被黑掉了. 所以经过那件事我们也在思考,如何做到不停机,进行热部署.单机环境下(双机 ...
- 学海无涯的整理Ing..........
1.文章:Understanding JavaScript Function Invocation and “this” http://yehudakatz.com/2011/08/11/unders ...
- Java %c0%ae 安全模式绕过漏洞
漏洞类型:安全模式绕过漏洞 漏洞描述:在Java端"%c0%ae"解析为"\uC0AE",最后转义为ASCCII低字符-".".通过这个方法 ...
- PHP笔记
<?php//统计访问量 if(!@$fp=fopen("num.txt","r")){ echo "num.txt文件创建成功!<br& ...
- 在虚机中安装CentOS
摘要 最近看到.net core 1发布的内容,也想尝试着在lunix上跑一圈.linux这方面的知识一直都没怎么接触过,只在工作中见同事操作过,看到满屏幕的命令行,感觉非常的高大上,趁着现在赶紧学习 ...