【题目链接】

  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(线段树+传标)的更多相关文章

  1. 【BZOJ1798】【AHOI2009】维护序列(线段树)

    题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...

  2. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  3. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  4. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  5. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  6. 1798: [Ahoi2009]Seq 维护序列seq

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 2930  Solved: 1087[Submit ...

  7. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5504  Solved: 1937[Submit ...

  8. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  9. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

随机推荐

  1. python os.stat() 和 stat模块详解

    stat 系统调用时用来返回相关文件的系统状态信息的. 首先我们看一下stat中有哪些属性: >>> import os >>> print os.stat(&qu ...

  2. Tomcat启动报错:严重: StandardServer.await: create[8005] java.net.BindException: Cannot assign requested address

    org.apache.catalina.core.StandardServer await        SEVERE: StandardServer.await: create[8005]:    ...

  3. sudo

    sudo的目的:为非根用户授予根用户的权限: 配置文件:/etc/sudoers visudo命令编辑修改/etc/sudoers配置文件 1.一般用户赋权设置: [root@localhost ~] ...

  4. redhat6和ubuntu13.10在WMware player 下与Windows共享文件

    Redhat下: 点击VMware的 setting -> vmware tools install mount /dev/cdrom /mnt/cdromcd /mnt/cdrom里面有一个v ...

  5. command-t插件使用说明

    类似于SourceInsight的Project Window,快速浏览项目里的文件 \t或:CommandT打开该插件 g:CommandTTraverseSCM设置搜索工程的根目录 tab在提示窗 ...

  6. UINavigationController学习笔记

    http://site.douban.com/129642/widget/notes/5513129/note/187701199/ 1-view controllers的关系:Each custom ...

  7. [Codeforces673C]Bear and Colors(枚举,暴力)

    题目链接:http://codeforces.com/contest/673/problem/C 题意:给一串数,不同大小的区间内出现次数最多的那个数在计数的时候会+1,问所有区间都这样计一次数,所有 ...

  8. Codeforces Round #247 (Div. 2) C. k-Tree (dp)

    题目链接 自己的dp, 不是很好,这道dp题是 完全自己做出来的,完全没看题解,还是有点进步,虽然这个dp题比较简单. 题意:一个k叉树, 每一个对应权值1-k, 问最后相加权值为n, 且最大值至少为 ...

  9. bzoj3994

    智商太低了 详细题解在这里http://blog.csdn.net/zmoiynlp/article/details/45176129 ; ..max] of longint; g:..max] of ...

  10. 对象不支持“attachEvent”属性或方法的解决办法

    有些脚本在IE11下执行会报错误: 对象不支持“attachEvent”属性或方法 解决办法 解决办法:把attachEvent改为addEventListener即可