线段树加乘懒标记裸题。

#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. 【干货】JavaScript DOM编程艺术学习笔记10-12【完】

    十.用JavaScript实现动画效果 鼠标放到链接上,每次只显示图片的一小部分,加快加载速度. js: function prepareSlideshow(){ //对象检测 if(!documen ...

  2. IIS发布网站出错解决方案

    1.第一类错误(Web服务器被配置为不列出此目录的内容) 问题所在没有为请求的URL设置默认文档,在IIS“默认文档”添加一个你要访问的默认文档名字,如:Default.aspx. 2.第二类错误(请 ...

  3. Hyper-V 2016 配置管理系列(准备篇)

    2.1 推荐软硬件配置 2.2 Hyper主机前提准备 前提条件: 具有二级地址转换(SLAT)的64位处理器.要安装Hyper-V虚拟化组件(如Windows管理程序),处理器必须具有SLAT 足够 ...

  4. jquery-weui picker组件实现只选择年月

    var date = new Date() var month = date.getMonth()+1 //获取当前月份 $('#selectTime').picker({ toolbarTempla ...

  5. 2018.7.1 css项目之模仿满屋花首页css+idv布局实现

    可以分开写 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF ...

  6. CopyOnWriteArrayList分析——能解决什么问题

    CopyOnWriteArrayList主要可以解决的问题是并发遍历读取无锁(通过Iterator) 对比CopyOnWriteArrayList和ArrayList 假如我们频繁的读取一个可能会变化 ...

  7. angular6项目中使用echarts图表的方法(有一个坑,引用报错)

    1.安装相关依赖(采用的webpack) npm install ecahrts --save npm install ngx-echarts --save 2.angular.json 配置echa ...

  8. USACO09FEB Fair Shuttle

    题目传送门 据说\(NOIp\)前发题解可以\(\mathfrak{RP}\)++ 因为要尽可能满足更多奶牛,所以按照这种区间贪心题的套路,先按右端点排序,然后依次遍历,能坐车的就让它们坐车,这样一定 ...

  9. js当中mouseover和mouseout多次触发(非冒泡)

    JS当中,mouseover和mouseout多次触发事件,不光是冒泡会产生,就是不冒泡,在一定条件下 ,也会产生多次触发事件: 例如下面的结构的情况下,我在class="ceng_up f ...

  10. 零基础快速入门SpringBoot2.0教程 (四)

    一.JMS介绍和使用场景及基础编程模型 简介:讲解什么是小写队列,JMS的基础知识和使用场景 1.什么是JMS: Java消息服务(Java Message Service),Java平台中关于面向消 ...