【bzoj1798】维护序列
线段树维护两个标记。
*0的操作在实质上没有任何影响。
#include <cstdio>
#include <cctype>
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define LL long long
#define lc (x<<1)
#define rc (x<<1|1)
#define siz(x) (tr[x].r-tr[x].l+1)
const int N=131072;
const int S=262144;
int n,p,m,a[N];
struct Tree {
int l,r;
int a,b; //tag(a,b): ax+b
int sum;
Tree(int _l=0,int _r=0) {
l=_l,r=_r;
a=1,b=0;
sum=0;
}
}tr[S];
int rd(void) {
int x=0,f=1; char c=getchar();
while (!isdigit(c)) {
if (c=='-') f=-1;
c=getchar();
}
while (isdigit(c)) {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void Pushup(int x) {
tr[x].sum=(tr[lc].sum+tr[rc].sum)%p;
}
void Clear(int x) {
int a=tr[x].a,b=tr[x].b; if (a==1&&!b) return; tr[x].a=1,tr[x].b=0;
tr[lc].sum=((LL)a*tr[lc].sum+(LL)b*siz(lc))%p; tr[lc].a=(LL)a*tr[lc].a%p; tr[lc].b=((LL)a*tr[lc].b+b)%p;
tr[rc].sum=((LL)a*tr[rc].sum+(LL)b*siz(rc))%p; tr[rc].a=(LL)a*tr[rc].a%p; tr[rc].b=((LL)a*tr[rc].b+b)%p;
}
void Build(int x,int l,int r) {
tr[x]=Tree(l,r);
if (l!=r) {
int mid=(l+r)>>1;
Build(lc,l,mid);
Build(rc,mid+1,r);
Pushup(x);
}
else tr[x].sum=a[l];
}
void Modify(int x,int l,int r,int a,int b) {
if (l<=tr[x].l&&tr[x].r<=r) {
tr[x].sum=((LL)a*tr[x].sum+(LL)b*siz(x))%p;
tr[x].a=(LL)a*tr[x].a%p;
tr[x].b=((LL)a*tr[x].b+b)%p;
return;
}
Clear(x);
int mid=(tr[x].l+tr[x].r)>>1;
if (l<=mid)
Modify(lc,l,r,a,b);
if (mid<r)
Modify(rc,l,r,a,b);
Pushup(x);
}
int Query(int x,int l,int r) {
if (l<=tr[x].l&&tr[x].r<=r) return tr[x].sum;
Clear(x);
int sum=0; int mid=(tr[x].l+tr[x].r)>>1;
if (l<=mid) {
int t=Query(lc,l,r);
sum=(sum+t)%p;
}
if (mid<r) {
int t=Query(rc,l,r);
sum=(sum+t)%p;
}
return sum;
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("sd.in","r",stdin);
freopen("sd.out","w",stdout);
#endif
n=rd(),p=rd();
rep(i,1,n) a[i]=rd();
Build(1,1,n);
m=rd();
rep(i,1,m) {
int kd=rd(); int x,y,z;
switch (kd) {
case 1:
x=rd(),y=rd(),z=rd();
Modify(1,x,y,z,0);
break;
case 2:
x=rd(),y=rd(),z=rd();
Modify(1,x,y,1,z);
break;
case 3:
x=rd(),y=rd();
int res=Query(1,x,y);
printf("%d\n",res);
break;
}
}
return 0;
}
【bzoj1798】维护序列的更多相关文章
- BZOJ1798 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 8058 Solved: 2964[Submit ...
- 【双标记线段树】bzoj1798维护序列seq
一.题目 描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列 ...
- bzoj1798 维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- p2023&bzoj1798 维护序列
传送门(洛谷) 传送门(bzoj) 题目 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全 ...
- bzoj1798维护序列
题目链接 暴力数据结构之线段树$qwq$ 裸题直接敲板子 忘了啥时候写的了$qwq$ 直接上代码吧 /************************************************* ...
- BZOJ-1798 维护序列
线段树.支持区间加.区间乘.区间查询和. 标记下移还有取模要注意. var n,p,q,i,s,t:longint; a:int64; num,n1,n2,n3:array[0..500000] of ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- bzoj 维护序列seq(双标记线段树)
Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 4184 Solved: 1518[Submit][Status][Discus ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
随机推荐
- meanshift
http://blog.jasonding.top/2014/10/14/Machine%20Learning/%E3%80%90%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%8 ...
- magento -- 解决magento错误:ERROR: Base table or view already exists: 1050 Table ... already exists
相信有更新magento或者,备份转移magento站点的时候可能会碰到类似这样的错误提示: Base table or view already exists: 1050 Table ... alr ...
- 20145320 《Java程序设计》第2周学习总结
20145320 <Java程序设计>第2周学习总结 教材学习内容总结 3.1 类型.变量与运算符 基本类型 整数(short.int.long) .字节(byte) .浮点数(float ...
- RCNN--对象检测的又一伟大跨越
最近在实验室和师兄师姐在做有关RCNN的研究,发现这里面坑很深呀,在网上找了一个大牛的博客,准备下来继追OPENCV同时,再来追一个RCNN的学习笔记的博文,博文地址如下:http://blog.cs ...
- HDU 4947 GCD Array 容斥原理+树状数组
GCD Array Time Limit: 11000/5500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Android--菜单详解
Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单. 选项菜单: 一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种.最常用的是干版本创建 ...
- nginx简单的rewrite配置
假设当前已存在location /test/,希望配置一个短连接/ts/与之相同,就需要用到rewrite 直接配置到server段 rewrite ^/ts/(.*) /test/$1; 或者放到l ...
- ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]>
ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]> 因为这个是xml格式的,所以不允许出现类似">"这样的字符,但是都 ...
- C++去掉字符串首尾的 空格 换行 回车
/* *去掉字符串首尾的 \x20 \r \n 字符 */ void TrimSpace(char* str) { ; char *end = str; char *p = str; while(*p ...
- Web的Ajax应用开发模式(三)——Ajax的开发
Ajax是XMLHttpRequest对象和JavaScript.CSS.HTML.DOM等多种技术的结合. 此处重点强调XMLHttpRequest的以下特点,所以测试人员在测试到WEB的Ajax应 ...