[AHOI2009]维护序列
OJ题号:洛谷2023、BZOJ1798
思路:
- #include<cstdio>
- #include<cctype>
- #include<cstring>
- #include<cstdlib>
- #include<algorithm>
- using namespace std;
- #define ll long long
- #define maxn 100001
- #define root 1
- #define _left <<1
- #define _right <<1|1
- int n,m;
- ll mod;
- inline int getint() {
- char ch;
- while(!isdigit(ch=getchar()));
- int x=ch^'';
- while(isdigit(ch=getchar())) x=((x+(x<<))<<)+(ch^'');
- return x;
- }
- inline ll getll() {
- char ch;
- while(!isdigit(ch=getchar()));
- ll x=ch^'';
- while(isdigit(ch=getchar())) x=((x+(x<<))<<)+(ch^'');
- return x;
- }
- struct SegmentTree {
- ll val[maxn<<],add[maxn<<],mul[maxn<<];
- void push_up(const int p) {
- val[p]=(val[p _left]+val[p _right])%mod;
- }
- void build(const int p,const int b,const int e) {
- mul[p]=;
- add[p]=;
- if(b==e) {
- val[p]=getll()%mod;
- return;
- }
- int mid=(b+e)>>;
- build(p _left,b,mid);
- build(p _right,mid+,e);
- push_up(p);
- }
- int length(const int b,const int e) {
- return e-b+;
- }
- void push_down(const int p,const int b,const int e) {
- if(mul[p]!=) {
- val[p _left]=val[p _left]*mul[p]%mod;
- val[p _right]=val[p _right]*mul[p]%mod;
- mul[p _left]=mul[p _left]*mul[p]%mod;
- mul[p _right]=mul[p _right]*mul[p]%mod;
- add[p _left]=add[p _left]*mul[p]%mod;
- add[p _right]=add[p _right]*mul[p]%mod;
- mul[p]=;
- }
- if(add[p]) {
- int mid=(b+e)>>;
- val[p _left]=(val[p _left]+add[p]*length(b,mid))%mod;
- val[p _right]=(val[p _right]+add[p]*length(mid+,e))%mod;
- add[p _left]=(add[p _left]+add[p])%mod;
- add[p _right]=(add[p _right]+add[p])%mod;
- add[p]=;
- }
- }
- void modify_mul(const int p,const int b,const int e,const int l,const int r,const ll x) {
- if((b==l)&&(e==r)) {
- val[p]=val[p]*x%mod;
- mul[p]=mul[p]*x%mod;
- add[p]=add[p]*x%mod;
- return;
- }
- push_down(p,b,e);
- int mid=(b+e)>>;
- if(l<=mid) modify_mul(p _left,b,mid,l,min(mid,r),x);
- if(r>mid) modify_mul(p _right,mid+,e,max(mid+,l),r,x);
- push_up(p);
- }
- void modify_add(const int p,const int b,const int e,const int l,const int r,const ll x) {
- if((b==l)&&(e==r)) {
- val[p]=(val[p]+x*length(b,e))%mod;
- add[p]=(add[p]+x)%mod;
- return;
- }
- push_down(p,b,e);
- int mid=(b+e)>>;
- if(l<=mid) modify_add(p _left,b,mid,l,min(mid,r),x);
- if(r>mid) modify_add(p _right,mid+,e,max(mid+,l),r,x);
- push_up(p);
- }
- ll query(const int p,const int b,const int e,const int l,const int r) {
- if((b==l)&&(e==r)) {
- return val[p];
- }
- int mid=(b+e)>>;
- ll ans=;
- push_down(p,b,e);
- if(l<=mid) ans=(ans+query(p _left,b,mid,l,min(mid,r)))%mod;
- if(r>mid) ans=(ans+query(p _right,mid+,e,max(mid+,l),r))%mod;
- return ans;
- }
- };
- SegmentTree tree;
- int main() {
- n=getint();
- mod=getll();
- tree.build(root,,n);
- m=getint();
- while(m--) {
- int op=getint(),x=getint(),y=getint();
- if(op==) {
- ll k=getll()%mod;
- tree.modify_mul(root,,n,x,y,k);
- continue;
- }
- if(op==) {
- ll k=getll()%mod;
- tree.modify_add(root,,n,x,y,k);
- continue;
- }
- printf("%lld\n",tree.query(root,,n,x,y));
- }
- return ;
- }
[AHOI2009]维护序列的更多相关文章
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [Luogu 2023] AHOI2009 维护序列
[Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷 P2023 [AHOI2009]维护序列
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解
题目传送: P3373 [模板]线段树 2 P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
随机推荐
- Canvas锯齿问题
canvas的宽高必须通过HTML属性指定,不能通过CSS指定,否则会有锯齿 这个是通过CSS定义宽高,绘制的图形 #myCanvas{ background: black; height: 800p ...
- 论文阅读笔记二十九:SSD: Single Shot MultiBox Detector(ECCV2016)
论文源址:https://arxiv.org/abs/1512.02325 tensorflow代码:https://github.com/balancap/SSD-Tensorflow 摘要 SSD ...
- HTTP 599: SSL certificate problem: unable to get local issuer certificate错误
自己在用 PySpider 框架爬虫运行代码后时出现 HTTP 599: SSL certificate problem: unable to get local issuer certificate ...
- 字典树HihoCoder - 1014
输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词.接 ...
- Linux下Nginx安装/启动/重启/停止
Nginx是高性能的web服务器也是非常好用反向代理服务器,可以实现负载均衡,动静分离等策略,在linux下用的非常多.下面是下载地址 http://nginx.org/en/download.h ...
- 设置git记住用户和密码
git config --global credential.helper store
- ElasticSearch简要总览
今天看了一下ElasticSearch的相关文档,我做了如下总结: 发现越来越喜欢画图归纳总结知识了,看图说话 集群特性说明 健康状况的说明 如何配置分片? 接下来一张图总结下操作相关的总结 接下来, ...
- WMSYS.WM_CONCAT返回CLOB类型的解决办法
https://blog.csdn.net/cnm_csdn_wt/article/details/80047878
- Python学习(十八)—— 数据库(三)
转载自http://www.cnblogs.com/linhaifeng/articles/7356064.html 一.数据操作 1.插入数据INSERT 1. 插入完整数据(顺序插入) 语法一: ...
- BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8687797.html 题目传送门 - BZOJ1010 题意 一个数列$C$,然后把这个数列划分成若干段. 对于 ...