【线段树】Bzoj1798 [AHOI2009] 维护序列
Description
Input
Output
Sample Input
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
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] 维护序列的更多相关文章
- BZOJ1798[Ahoi2009]维护序列——线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解
题目传送: P3373 [模板]线段树 2 P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- [Luogu 2023] AHOI2009 维护序列
[Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
随机推荐
- $cordovaCamera 插件 上传头像 图片功能
首先要注入 $cordovaCamera 使用相机拍照 var useCamera = function() { var options = { //这些参数可能要配合着使用,比如选择了source ...
- UML类图中连接线与箭头的含义(转)
UML类图是描述类之间的关系 概念 类(Class):使用三层矩形框表示. 第一层显示类的名称,如果是抽象类,则就用斜体显示. 第二层是字段和属性. 第三层是类的方法. 注意前面的符号,'+'表示pu ...
- word search(二维数组中查找单词(匹配字符串))
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- 多重影分身——C#中多线程的使用一(基础)
首先明确几个概念: 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 一个程序通常只有一个进程(不包括exe ...
- 面向对象,更适合JavaScript
面向对象程序设计是软件开发中一个很庞大很复杂的话题,它并不是仅仅学会类.继承.封装.多态这些面向对象编程语法元素就表示掌握的,这些语法元素只是实现面向对象程序的工具, 就像砖块.水泥能搭建小屋,也能造 ...
- Mybatis 系列10
在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程 1. SqlSessionFactory 与 SqlSession. 通过前面的章 ...
- GNSS相关网站汇总
转载: https://blog.csdn.net/zzh_my/article/details/78449972 一.bernese 数据表文件下载 ftp://nfs.kasi.re.kr rin ...
- SVD的概念以及应用
第十四章 利用SVD简化数据 一.引言 SVD的全称是奇异值分解,SVD的作用是它能够将高维的数据空间映射到低维的数据空间,实现数据约减和去除噪声的功能. SVD的特点主要有以下几个方面: 1.它的优 ...
- Java Web Without SSM(前言)
是的,Spring,Mybaties确实给我们带来了方便的轻量级JavaWeb开发,但是,对于大部分中小系统来说,分层,框架,规范,已经成为一种累赘.实际的程序开发过程中,大部分时间都花在了" ...
- [ SSH框架 ] Struts2框架学习之三(OGNl和ValueStack值栈学习)
一.OGNL概述 1.1 什么是OGNL OGNL的全称是对象图导航语言( object-graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可 ...