线段树加乘懒标记裸题。

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, mod, m, t, u, v;
ll w;
struct SGT{
ll sum[400005];
ll lzt[400005];
ll mul[400005];
void built(int o, int l, int r){
lzt[o] = 0;
mul[o] = 1;
if(l==r) scanf("%lld", &sum[o]);
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(l<=mid) built(lson, l, mid);
if(mid<r) built(rson, mid+1, r);
sum[o] = (sum[lson] + sum[rson]) % mod;
}
}
void push_down(int o, int l, int r, int lson, int rson, int mid){
mul[lson] = (mul[o] * mul[lson]) % mod;
mul[rson] = (mul[o] * mul[rson]) % mod;
lzt[lson] = (mul[o] * lzt[lson]) % mod;
lzt[rson] = (mul[o] * lzt[rson]) % mod;
sum[lson] = (mul[o] * sum[lson]) % mod;
sum[rson] = (mul[o] * sum[rson]) % mod;
mul[o] = 1;
lzt[lson] = (lzt[o] + lzt[lson]) % mod;
lzt[rson] = (lzt[o] + lzt[rson]) % mod;
sum[lson] = (sum[lson] + (mid-l+1) * lzt[o]) % mod;
sum[rson] = (sum[rson] + (r-mid) * lzt[o]) % mod;
lzt[o] = 0;
}
void update_add(int o, int l, int r, int x, int y, ll k){
if(l>=x && r<=y){
sum[o] = (sum[o] + (r-l+1) * k) % mod;
lzt[o] = (lzt[o] + k) % mod;
}
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(mul[o]!=1 || lzt[o]) push_down(o, l, r, lson, rson, mid);
if(x<=mid) update_add(lson, l, mid, x, y, k);
if(mid<y) update_add(rson, mid+1, r, x, y, k);
sum[o] = (sum[lson] + sum[rson]) % mod;
}
}
void update_mul(int o, int l, int r, int x, int y, ll k){
if(l>=x && r<=y){
mul[o] = (mul[o] * k) % mod;
lzt[o] = (lzt[o] * k) % mod;
sum[o] = (sum[o] * k) % mod;
}
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(mul[o]!=1 || lzt[o]) push_down(o, l, r, lson, rson, mid);
if(x<=mid) update_mul(lson, l, mid, x, y, k);
if(mid<y) update_mul(rson, mid+1, r, x, y, k);
sum[o] = (sum[lson] + sum[rson]) % mod;
}
}
ll query(int o, int l, int r, int x, int y){
if(l>=x && r<=y) return sum[o];
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
ll ans=0;
if(mul[o]!=1 || lzt[o]) push_down(o, l, r, lson, rson, mid);
if(x<=mid) ans = (ans + query(lson, l, mid, x, y)) % mod;
if(mid<y) ans = (ans + query(rson, mid+1, r, x, y)) % mod;
return ans;
}
}
}sgt;
int main(){
cin>>n>>mod;
sgt.built(1, 1, n);
cin>>m;
while(m--){
scanf("%d", &t);
if(t==1){
scanf("%d %d %lld", &u, &v, &w);
sgt.update_mul(1, 1, n, u, v, w);
}
else if(t==2){
scanf("%d %d %lld", &u, &v, &w);
sgt.update_add(1, 1, n, u, v, w);
}
else{
scanf("%d %d", &u, &v);
printf("%lld\n", sgt.query(1, 1, n, u, v));
}
}
return 0;
}

luogu2023 [AHOI2009]维护序列的更多相关文章

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

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

  2. [Luogu 2023] AHOI2009 维护序列

    [Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...

  3. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  4. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  5. 洛谷 P2023 [AHOI2009]维护序列

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...

  6. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  7. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  8. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  9. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

随机推荐

  1. python基本数据类型,int,bool,str

    一丶python基本数据类型 1.int 整数,主要用来进行数学运算. 2.str 字符串,可以保存少量数据并进行相应的操作 3.bool 判断真假.True.False 4.list 存储大量数据, ...

  2. 常用的CSS属性列表汇总

    常用的CSS属性列表汇总 近期教学给学员总结常用的CSS属性,方便学习查询,正好发上来也给大家分享一下. 表格最右列的数字标识支持的CSS最低版本. 01. CSS背景属性(Background) 属 ...

  3. 【extjs6学习笔记】1.15 初始: 关于build

    调试版本 sencha app build --development 发布版本 sencha app build 说明: 使用第三方库时,目前sencha可能还有bug,会更改第三方库内容,所以发布 ...

  4. lintcode五道题

    1.二叉树的最大深度 最大深度为根节点到最远叶子节点的距离为最大深度,于是可以先找到根节点到叶子节点最大的距离,过程就可以分为左子树 和右子树分别进行来求左.右子树的最大深度lh=height(roo ...

  5. ADO.NET #3-1 (GridView + DataReader + SqlCommand)完全手写Code Behind

    [C#] ADO.NET #3-1 (GridView + DataReader + SqlCommand)完全手写.后置程序代码 之前有分享过一个范例 [C#] ADO.NET #3 (GridVi ...

  6. php之cURL惯用

    1.php cURL的强大:PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器.使用各种协议.libcurl 目前支持的协议有 http.https.ft ...

  7. 关于Mongodb RC的思考

    Mongodb Oplog 和 Journal log 的关系与执行顺序 就关系来说,op log实际上与数据是一致的概念. 但在有 RC的时候,执行顺序 w  j 的设置 如果不设置 j ,则默认是 ...

  8. 比特币中P2PKH(pay-to-public-key-hash)的锁定脚本和解锁脚本

    脚本格式 P2PKH的锁定脚本为: OP_DUP OP_HASH160 PUSHDATA(<Cafe Public Key Hash>) OP_EQUALVERIFY OP_CHECKSI ...

  9. hbase查询基于标准sql规范中间件Phoenix

    Phoenix是个很好的hbase 查询工具,在hbase中安装也很简单,可以按照 http://www.cnblogs.com/laov/p/4137136.html 这个连接中进行配置客户端和服务 ...

  10. Json的本地写入和读取,也可以方便在开发中数据的调试

    不知道小伙伴们,在开发中,数据调试的过程中,尤其是很多状态的情况下调试,是不是总是麻烦后台的小哥改变不同的状态,总感觉这样太麻烦了, 那么就可以,把数据写入到本地,然后去沙盒中,找到这个写入的文件,直 ...