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:$询 ...
随机推荐
- vmware tools 在linux中的作用
VMware Tools是VMware虚拟机中自带的一种增强工具,相当于VirtualBox中的增强功能 是VMware提供的增强虚拟显卡和硬盘性能 以及同步虚拟机与主机时钟的驱动程序. 只有在VMw ...
- 【原】webpack学习笔记
之前在react的项目中有用过webpack,不过没有认真的去研究,这段时间又重新好好的学习一下webpack,发觉 webpack是一个很强大的东西.而且很好用,方便,接下来主要是做一下学习的笔记 ...
- MYSQL 常用函数(数学、字符串、日期时间、系统信息、加密)
一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...
- IBatis插入类的实例
<insert id="insOrderDetail" parameterClass="OrderDetail"> INSERT INTO Orde ...
- centos linux安装telnet 过程及问题(源于内部tomcat网站,外部无法访问)
首先本地没有telnet客户端及服务器 root权限下安装 yum install telnet yum install telnet-server vi /etc/xinetd.d/telnet 这 ...
- MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题
首先,环境:ubuntu 14.04,采用apt-get的方式安装的,手动安装可能路径设置稍有区别. 1.安装MySQL后,用命令行首次启动时发现找不到Mysqld.sock文件,提示: ERROR ...
- EF 索引
public class CustomerMap : EntityTypeConfiguration<Customer> { public CustomerMap() { this.Pro ...
- JavaBean出现的目的
一.JavaBean出现的目的 由于只用JSP开发会发现使用了很多的Scriptlet,会使得jsp文件非常混乱.如果使用了JavaBean,则可以大大减少JSP中代码量. JSP的理想状态是只负责显 ...
- C++ default 和delete的新用法
C++中的默认函数与default和delete用法一. 类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数 b.类中 ...
- Effective Objective-C 2.0 — 第10条:在既有类中使用关联对象存放自定义数据
可以通过“关联对象”机制来把两个对象连起来 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系” 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难于 ...