线段树加乘懒标记裸题。

#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. LESS CSS非常实用实例应用

    @charset "UTF-8"; @base-color:#333; // 圆角 .border-radius (@radius: 5px) { -webkit-border-r ...

  2. return false;和e.preventDefault;和e.stopPropagation的区别

    因为有父, 子节点同在, 因为有监听事件和浏览器默认动作之分. 使用 JavaScript 时为了达到预期效果经常需要阻止事件和动作执行. 一般我们会用到三种方法, 分别是 stopPropagati ...

  3. 使用Python开发环境Wing IDE设立项目注意事项

    使用Wing IDE的第一步是建立一个项目文件,这样Wing IDE就可以找到并分析源代码,存储工作. Wing IDE会自动以默认的项目进行启动.在本教程中用户也可以使用这个默认项目进行示例操作.如 ...

  4. COGS 1453. [USACO NOV]空牛栏

    ★★   输入文件:empty.in   输出文件:empty.out   简单对比时间限制:1 s   内存限制:64 MB [题目描述] FJ建的新牛棚里有N(2<=N<=3,000, ...

  5. HDU2433 最短路 + 剪枝优化

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2433 ,最短路(SPFA或优化过的Dijstra) + 剪枝优化 这道题关键还是在几个剪枝上面,没有剪 ...

  6. 动态规划专题(一)——状压DP

    前言 最近,决定好好恶补一下我最不擅长的\(DP\). 动态规划的种类还是很多的,我就从 状压\(DP\) 开始讲起吧. 简介 状压\(DP\)应该是一个比较玄学的东西. 由于它的时间复杂度是指数级的 ...

  7. 6.3安装squid

    1. Frist you need to install Development tools #yum groupinstall "Development Tools" 2. Ge ...

  8. Ribbon 负载均衡搭建

    本机IP为  192.168.1.102 1.   新建Maven  项目    ribbon 2.   pom.xml <project xmlns="http://maven.ap ...

  9. C#的接口基础教程之四 访问接口

    对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的.如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员.但由于接口支持多继承,在多继承中,如果 ...

  10. ZRDay6A. 萌新拆塔(三进制状压dp)

    题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...