线段树加乘懒标记裸题。

#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. WebClient实现文件下载详解(二)

    .Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,只用到了一些很简单的功能就可以实现以前不好实现的功能,很方便. 简单介绍一下Web ...

  2. Android studio 配置忽略

    直接在Ignored Files选项里点击+号,在弹出的对话框选择第二项,然后依次输入上面包含的 .gradle .idea build 三个文件夹目录,再选择第一项,找到local.properti ...

  3. intellij idea中设置SVN插件教程

    1.选择VCS→Browser VCS Repository→Browse Subversion Repository 2.在弹出的SVN Repository菜单中,选择左上角的绿色“+”号,填写S ...

  4. Yii2 Working with Relational Data at ActiveDataProvider

    Yii2 Working with Relational Data at ActiveDataProvider namespace common\models; use Yii; use yii\ba ...

  5. 修复SQL中的孤立账户

    EXEC sys.sp_change_users_login 'AUTO_FIX','登录名',NULL,'登录密码'

  6. pat甲级1139

    1139 First Contact(30 分) Unlike in nowadays, the way that boys and girls expressing their feelings o ...

  7. java常用框架总结

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...

  8. 撸了个 django 数据迁移工具 django-supertube

    撸了个 django 数据迁移工具 django-supertube 支持字段映射和动态字段转化. 欢迎 star,issue https://github.com/FingerLiu/django- ...

  9. 基于Dockerfile 构建redis5.0.0(包括持久化)及RedisDestopManager 监控

    一 创建Dockerfile [root@zxmrlc docker]# mkdir redis [root@zxmrlc docker]# cd redis && touch Doc ...

  10. hdu-1272 小希的迷宫---并查集或者DFS

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目大意: Problem Description 上次Gardon的迷宫城堡小希玩了很久(见 ...