练一下线段树模板,区间乘法。

#include<bits/stdc++.h>
#define lson (o<<1)
#define rson (o<<1|1)
const int N=;
using namespace std;
typedef long long ll;
ll n,m,yql;
ll a[N];
struct Segment_Tree{
ll sumv[N<<],addv[N<<],mulv[N<<];
inline void pushup(int o){sumv[o]=(sumv[lson]+sumv[rson])%yql;}
inline void pushdown(int o,int l,int r){
if(mulv[o]==&&addv[o]==)return;
int mid=(l+r)>>;
mulv[lson]=mulv[lson]*mulv[o]%yql;
mulv[rson]=mulv[rson]*mulv[o]%yql;
addv[lson]=(addv[lson]*mulv[o]%yql+addv[o])%yql;
addv[rson]=(addv[rson]*mulv[o]%yql+addv[o])%yql;
sumv[lson]=((sumv[lson]*mulv[o])%yql+addv[o]*1LL*(mid-l+)%yql)%yql;
sumv[rson]=((sumv[rson]*mulv[o])%yql+addv[o]*1LL*(r-mid)%yql)%yql;
mulv[o]=;addv[o]=;
}
inline void build(int o,int l,int r){
mulv[o]=;addv[o]=;sumv[o]=;
if(l==r){sumv[o]=a[l];return;}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
pushup(o);
}
inline void mul(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){
mulv[o]=mulv[o]*1LL*v%yql;
addv[o]=addv[o]*1LL*v%yql;
sumv[o]=sumv[o]*1LL*v%yql;
return;
}
pushdown(o,l,r);
int mid=(l+r)>>;
if(ql<=mid)mul(lson,l,mid,ql,qr,v);
if(qr>mid)mul(rson,mid+,r,ql,qr,v);
pushup(o);
}
inline void add(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){
addv[o]=(addv[o]+1LL*v)%yql;
sumv[o]=(sumv[o]+1LL*(r-l+)*v%yql)%yql;
return;
}
pushdown(o,l,r);
int mid=(l+r)>>;
if(ql<=mid)add(lson,l,mid,ql,qr,v);
if(qr>mid)add(rson,mid+,r,ql,qr,v);
pushup(o);
}
inline ll querysum(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sumv[o];
int mid=(l+r)>>;ll ans=;
pushdown(o,l,r);
if(ql<=mid)ans+=querysum(lson,l,mid,ql,qr),ans%=yql;
if(qr>mid)ans+=querysum(rson,mid+,r,ql,qr),ans%=yql;
return ans;
}
}T;
inline ll read(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();yql=read();
for(int i=;i<=n;i++)a[i]=read();
T.build(,,n);
m=read();
while(m--){
ll opt=read();
if(opt==){int l=read(),r=read(),x=read();T.mul(,,n,l,r,x);}
if(opt==){int l=read(),r=read(),x=read();T.add(,,n,l,r,x);}
if(opt==){int l=read(),r=read();printf("%lld\n",T.querysum(,,n,l,r));}
}
}

【bzoj1798】【AHOI2009】维护序列的更多相关文章

  1. bzoj1798 [Ahoi2009]维护序列

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

  2. 【线段树】Bzoj1798 [AHOI2009] 维护序列

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

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

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

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

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

  5. [Luogu 2023] AHOI2009 维护序列

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

  6. [洛谷P2023] [AHOI2009]维护序列

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

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

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

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

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

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

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

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

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

随机推荐

  1. BZOJ 1037 生日聚会(神DP)

    这题的DP很难想,定义dp[i][j][a][b]表示用了i个男生,j个女生,任一连续的后缀区间内,男生比女生最多多a人,女生比男生最多多b人. 转移就是显然了. # include <cstd ...

  2. BZOJ1195 HNOI2006最短母串(状压dp)

    按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比 ...

  3. P1491 集合位置

    题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法 ...

  4. Flask的第一个应用

    Flask 是一个 Python 实现的 Web 开发微框架,微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展. 与Django功能上比较: Django:中间件,路由系统,视图(CBV ...

  5. 【BZOJ5297】【CQOI2018】社交网络(矩阵树定理)

    [BZOJ5297][CQOI2018]社交网络(矩阵树定理) 题面 BZOJ 洛谷 Description 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发 ...

  6. UVA.10192 Vacation (DP LCS)

    UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做 ...

  7. Mac将应用拖入Finder工具栏

    在Finder的工具栏上放一下应用,方便打开对应的文件,可以 Command + 鼠标拖动应用,将应用拖入Finder工具栏中. 本人的Finder工具栏上添加了vscode这个应用

  8. LibreOJ #6190. 序列查询(线段树+剪枝)

    莫队貌似是过不了的,这题是我没见过的科技... 首先区间按右端点排序,然后一个扫描线,扫到某个区间右端点时候计算答案,线段树上节点的信息并不需要明确定义,我们只要求线段树做到当前扫到now时,查询[L ...

  9. 第三方库安装——lxml

    环境 操作系统:CentOS 6.7 32-bit Python:2.6.6 安装 安装依赖软件 yum -y install gcc make python-devel libxml2-devel ...

  10. [python]爬站点

    #!/usr/bin/python 2 import urllib 3 import urllib2 4 import re 5 import os 6 7 dirs = ['js','img','p ...