bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1798
【题意】
给定一个序列,要求提供区间乘/加,以及区间求和的操作
【思路】
线段树+传标。
下传标记的方式可以类比这里 click here
【代码】
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 2e5+; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} int MOD ; struct Tnode {
int u,l,r;
ll sum,add,mul;
void mulv(ll x) ;
void addv(ll x) ;
void pushdown() ;
void maintain() ;
} T[N<<] ;
void Tnode::mulv(ll x) {
mul=(mul*x)%MOD;
sum=(sum*x)%MOD;
add=(add*x)%MOD;
}
void Tnode::addv(ll x) {
sum=(sum+(r-l+)*x)%MOD;
add=(add+x)%MOD;
}
void Tnode::pushdown() {
if(mul!=) {
T[u<<].mulv(mul);
T[u<<|].mulv(mul);
mul=;
}
if(add) {
T[u<<].addv(add);
T[u<<|].addv(add);
add=;
}
}
void Tnode::maintain() {
sum=(T[u<<].sum+T[u<<|].sum)%MOD;
}
void update(int u,int L,int R,int x,int flag) {
T[u].pushdown();
if(L<=T[u].l&&T[u].r<=R) {
if(flag==) T[u].addv(x);
else T[u].mulv(x);
} else {
int mid=T[u].l+T[u].r>>;
if(L<=mid) update(u<<,L,R,x,flag);
if(mid<R) update(u<<|,L,R,x,flag);
T[u].maintain();
}
}
ll query(int u,int L,int R) {
T[u].pushdown();
if(L<=T[u].l&&T[u].r<=R)
return T[u].sum;
else {
int mid=T[u].l+T[u].r>>;
ll ans=;
if(L<=mid) ans=(ans+query(u<<,L,R))%MOD;
if(mid<R) ans=(ans+query(u<<|,L,R))%MOD;
return ans;
}
} int n,m; ll a[N]; void build(int u,int l,int r) {
T[u]=(Tnode){u,l,r,,,};
if(l==r) {
T[u].sum=a[l]%MOD;
return ;
} else {
int mid=l+r>>;
build(u<<,l,mid);
build(u<<|,mid+,r);
T[u].maintain();
}
}
/* Debug
int print(int u) {
T[u].pushdown();
if(T[u].l==T[u].r) printf("%d,%d\n",T[u].l,T[u].v);
else {
print(u<<1),print(u<<1|1);
}
}
*/
int main()
{
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
n=read(),MOD=read();
FOR(i,,n) a[i]=read();
build(,,n);
m=read();
int op,l,r,x;
FOR(i,,m) {
op=read(),l=read(),r=read();
if(op==) {
x=read();
update(,l,r,x,);
} else
if(op==) {
x=read();
update(,l,r,x,);
} else {
printf("%lld\n",query(,l,r));
}
}
return ;
}
P.S.我竟然蛋疼的存了一个v,还一本正经地累计到sum里 <_<
bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)的更多相关文章
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 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 老师交给小可可一个维护数列的任务,现在小可 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
随机推荐
- Linux内核的同步机制
本文详细的介绍了Linux内核中的同步机制:原子操作.信号量.读写信号量和自旋锁的API,使用要求以及一些典型示例 一.引言 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程 ...
- Qt源码分析之QObject
原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...
- (转)最新版的SSH框整合(Spring 3.1.1 + Struts 2.3.1.2 + Hibernate 4.1)
最近一直有朋友在问,最新版的Spring.Struts.Hibernate整合老是有问题,昨晚大概看了一下.从Hibernate 4 开始,本身已经很好的实现了数据库事务模块,而Spring也把Hib ...
- VB 语言学习笔记.
暂时用到,学习学习. 变量声明 Dim 变量名 as 数据类型类型 Set 实例 = new 类名 自定义数据类型 Type 数据类型标识符 域名 As 数据类型; 域名 As 数据类型; 域名 As ...
- (step4.3.4)hdu 1258(Sum It Up——DFS)
题目大意:输入t,n,接下来有n个数组成的一个序列.输出总和为t的子序列 解题思路:DFS 代码如下(有详细的注释): #include <iostream> #include <a ...
- HDU 4725 The Shortest Path in Nya Graph(最短路拆点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:n个点,某个点属于某一层.共有n层.第i层的点到第i+1层的点和到第i-1层的点的代价均是 ...
- JAVA操作Excel 可配置,动态 生成复杂表头 复杂的中国式报表表头
转载:开源社区http://www.oschina.net/code/snippet_1424099_49530?p=2代码] [Java]代码 该代码实现了Excel复杂表头的生成 基于sql se ...
- 栈中的push实现
- js对联广告代码,兼容性高
var browser = { ie6: function () { return ((window.XMLHttpRequest == undefined) && (ActiveXO ...
- 解决hibernate向mysql插入中文乱码问题
一.mysql的问题解决 MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与coll ...