【线段树】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)把数列中 ...
随机推荐
- JAVA线程与线程、进程与进程间通信
I.线程与线程间通信 一.基本概念以及线程与进程之间的区别联系: 关于进程和线程,首先从定义上理解就有所不同1.进程是什么?是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系 ...
- MySQL性能调优——索引详解与索引的优化
--索引优化,可以说是数据库相关优化.理解尤其是查询优化中最常用的优化手段之一.所以,只有深入索引的实现原理.存储方式.不同索引间区别,才能设计或使用最优的索引,最大幅度的提升查询效率! 一.BTre ...
- mysql 带条件的sum/count 使用技巧
本测试只是简单测试,其用途不在于代替count函数配合where函数进行聚合计算,而是在复杂查询中在sum/count中加入条件,一次性求出不同条件下的聚合结果. 1.插入测试数据如图 2.sum计算 ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- 重装完的win10卡“请稍等”,然后电脑不断自动重启还是卡在“请稍等”?
http://bbs.pcbeta.com/viewthread-1625778-1-1.html 说实话我用U盘安装win10遇到过几次这种情况,不管是win10正式版还是之前的个别win10测试版 ...
- SQLServer Merger Using语法使用和注意点
SQL多表关联数据更新,如果数据量比较少的情况下,用Update也是可以的:脚本如下: UPDATE NA_AgentGrpOrder SET AttrServSIItem=b.AttrValue F ...
- Linux的动态库与静态库
1.动态库与静态库简介 在实际的软件开发中,为了方便使用一些被重复调用的公共代码,我们经常将这些公共的函数编译成动态库或静态库.我们知道程序一般要经过预处理.编译.汇编和链接这几个步骤才能变成可执行的 ...
- 关于SpringMVC控制器的一点补充
首先复习一下之前控制器的写法:http://www.cnblogs.com/eco-just/p/7882016.html. 我们可以看到,之前的写法是这样的: @RequestMapping(&qu ...
- Chatbot思考录
人工分词产生不一致性的原因主要在于人们对词的颗粒度的认知问题.在汉语里,词是表达意最基本的意思,再小意思就变了.在机器翻译中会有一种颗粒度比另外一种颗粒度更好的情况,颗粒度大的翻译效果好. 为了解决词 ...
- DevOps之三 Git的安装与配置
Centos7 安装Git 一.卸载Centos7 自带的git # git --version git version 1.8.3.1# whereis gitgit: /usr/bin/git / ...