Description

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

Input

第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。 操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。 操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值 (1≤t≤g≤N)。 同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

Output

对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

Sample Input

7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7

Sample Output

2
35
8
 

题解

三个数组sum, mul, add,具体操作看代码

要注意前面操作对当前的影响,及时pushback,统计祖先add&mul也要想清

以后做这种题目都要想清定义,每一步的影响,不然就都乱了

以后要自己想清造小数据过了后再去搞大数据拍,自己造的数据密度大很多的,而且先要保证正确性才行

代码

非常不愉快,打完后找标程对拍,大数据不一样,调了好久,结果是标程有问题QwQ

以后全部用ll保平安啦

#include<cstdio>
#define ll long long
const int maxn=4e5+; ll sumv[maxn],mulv[maxn],addv[maxn];
ll N,M,mod,p,q,w,x; void pushup(ll o,ll l,ll r){
sumv[o]=;
if(l<r) sumv[o]=sumv[o*]+sumv[o*+];
sumv[o]*=mulv[o],sumv[o]%=mod;
sumv[o]+=(r-l+)*addv[o],sumv[o]%=mod;
} void pushdown(ll o,ll l,ll r){
ll Mul=mulv[o],Add=addv[o],lc=o*,rc=o*+,mid=(l+r)>>;
sumv[lc]=(sumv[lc]*Mul+(mid-l+)*Add)%mod;
sumv[rc]=(sumv[rc]*Mul+(r-mid)*Add)%mod;
mulv[lc]=(mulv[lc]*Mul)%mod;
mulv[rc]=(mulv[rc]*Mul)%mod;
addv[lc]=(addv[lc]*Mul+Add)%mod;
addv[rc]=(addv[rc]*Mul+Add)%mod;
mulv[o]=;addv[o]=;
} void add(ll o,ll l,ll r){
if(p<=l&&q>=r) addv[o]+=w,addv[o]%=mod;
else{
pushdown(o,l,r);
int mid=(l+r)/;
if(p<=mid) add(o*,l,mid);
if(q>mid) add(o*+,mid+,r);
}
pushup(o,l,r);
} void mul(ll o,ll l,ll r){
if(p<=l&&q>=r){
mulv[o]*=w,mulv[o]%=mod;
addv[o]*=w,addv[o]%=mod;
}
else{
pushdown(o,l,r);
int mid=(l+r)/;
if(p<=mid) mul(o*,l,mid);
if(q>mid) mul(o*+,mid+,r);
}
pushup(o,l,r);
} ll ret;
void sum(ll o,ll l,ll r,ll Add,ll Mul){
if(p<=l&&q>=r){
ret+=Mul*sumv[o]+Add*(r-l+);
ret%=mod;
}
else{
int mid=(l+r)/;
if(p<=mid) sum(o*,l,mid,(Add+Mul*addv[o])%mod,Mul*mulv[o]%mod);
if(q>mid) sum(o*+,mid+,r,(Add+Mul*addv[o])%mod,Mul*mulv[o]%mod);
}
} int main(){
scanf("%lld%lld",&N,&mod);
for(int i=;i<=*N;i++) mulv[i]=; for(int i=;i<=N;i++){
scanf("%lld",&w);
p=q=i;
add(,,N);
} scanf("%lld",&M);
for(int i=;i<=M;i++){
scanf("%lld",&x);
if(x==){
scanf("%lld%lld%lld",&p,&q,&w);
mul(,,N);
}
else if(x==){
scanf("%lld%lld%lld",&p,&q,&w);
add(,,N);
}
else{
scanf("%lld%lld",&p,&q);
ret=;
sum(,,N,,);
printf("%lld\n",ret);
continue;
}
} return ;
}

【线段树】Bzoj1798 [AHOI2009] 维护序列的更多相关文章

  1. BZOJ1798[Ahoi2009]维护序列——线段树

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

  2. bzoj1798 [Ahoi2009]维护序列

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

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

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

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

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

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

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

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

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

  7. [Luogu 2023] AHOI2009 维护序列

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

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

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

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

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

随机推荐

  1. 工作中常用Git指令操作

    常用Git指令总结 前阵子有几天好不顺,可谓是喝水都呛着,更何况被Git给呛着了,还不轻,哈哈.所以打算总结一下自己在工作使用到Git相关的东西以及和大家探讨使用GIt的心得体会.于是,关于Git的的 ...

  2. Https背景与证书在spring boot项目中的使用

    https背景(本人学习参考中觉得不错的几篇文章) https如何解决安全问题 HTTPS 理论基础及其在 Android 中的最佳实践 什么是https 关于https的个人总结 总所周知http是 ...

  3. Django(三)runserver 命令源码分析

    应用环境 windows7 pycharm2018 profession python3.6 django2.0 我们在pycharm 启动django项目时,常常有这么一个命令操作: python ...

  4. 使用springmvc时静态的文件获取不到,比如说样式丢失的问题。

    当使用springmvc时前台所有的样式全部都消失不见了,查了很多资料,简单的说就是我在配置web.xml中的过滤器时将<url-pattern></url-pattern>中 ...

  5. 正确截取List指定位置的内容

    正确截取List指定位置的内容 import java.util.ArrayList; import java.util.List; public class ListUtils { public s ...

  6. Hbase出现ERROR: Can't get master address from ZooKeeper; znode data == null解决办法

    问题描述如下: hbase(main)::> list TABLE ERROR: Can't get master address from ZooKeeper; znode data == n ...

  7. Oracle入门《Oracle介绍》第一章1-3 Oracle 逻辑组件

    一.数据库的逻辑结构是从逻辑的角度分析数据库的组成.Oracle 的逻辑组件包括: 1.表空间 表空间是数据库中最大的逻辑单位,一个 Oracle 数据库至少包含一个表空间,就是名为SYSTEM的系统 ...

  8. Http 状态码(status code)常用总结

    本来计划写一篇浏览器错误码使用的详细总结,近来想了想,第一这不是很深入的知识点.主要还是一种规定:第二对常用的几种的一个使用场景已经有所了解了,所以今天就写一个简单的汇总,并黏贴常用几个错误码的介绍在 ...

  9. 洛谷 P1462 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  10. 在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示

    在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示 当我们在VS的C++中使用vector.list.map等这些STL容器,在开启调试的时 ...