链接:https://www.luogu.org/problemnew/show/P2023

裸的线段树维护+*

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 400010
#define mid (h+t)/2
#define ll long long
ll n,m,a[maxn],mo,c,d,e,lazy1[maxn],lazy2[maxn];
struct re
{
ll h,t,x;
}p[maxn];
void updata(ll x)
{
p[x].x=(p[x*].x+p[x*+].x)%mo;
}
void build(ll x,ll h,ll t)
{
p[x].h=h; p[x].t=t;
if (h==t)
{
p[x].x=a[h]; return;
}
build(x*,h,mid); build(x*+,mid+,t);
updata(x);
}
void down(ll x)
{
if (lazy2[x]!=)
{
p[x].x=(p[x].x*lazy2[x])%mo;
if (p[x].h!=p[x].t) //这一句效率有明显提高
{
lazy2[x*]=(lazy2[x*]*lazy2[x])%mo;
lazy2[x*+]=(lazy2[x*+]*lazy2[x])%mo;
lazy1[x*]=(lazy1[x*]*lazy2[x])%mo;
lazy1[x*+]=(lazy1[x*+]*lazy2[x])%mo;
}}
if (lazy1[x])
{
p[x].x=(p[x].x+lazy1[x]*(p[x].t-p[x].h+))%mo;
if (p[x].h!=p[x].t)
{
lazy1[x*]=(lazy1[x*]+lazy1[x])%mo;
lazy1[x*+]=(lazy1[x*+]+lazy1[x])%mo;
}}
lazy1[x]=; lazy2[x]=;
}
void change1(ll x,ll h,ll t,ll num)
{
down(x);
if (p[x].h>t||p[x].t<h) return;
if (h<=p[x].h&&p[x].t<=t)
{
lazy1[x]=(lazy1[x]+num)%mo;
down(x);
return;
}
change1(x*,h,t,num); change1(x*+,h,t,num);
updata(x);
}
void change2(ll x,ll h,ll t,ll num)
{
down(x);
if (p[x].h>t||p[x].t<h) return;
if (h<=p[x].h&&p[x].t<=t)
{
lazy1[x]=(lazy1[x]*num)%mo;
lazy2[x]=(lazy2[x]*num)%mo;
down(x);
return;
}
change2(x*,h,t,num); change2(x*+,h,t,num);
updata(x);
}
ll query(ll x,ll h,ll t)
{
down(x);
if (p[x].h>t||p[x].t<h) return();
if (h<=p[x].h&&p[x].t<=t) return(p[x].x);
return((query(x*,h,t)+query(x*+,h,t))%mo);
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m>>mo;
for (ll i=;i<=n;i++) cin>>a[i];
for (int i=;i<=maxn-;i++) lazy2[i]=;
build(,,n);
for (ll i=;i<=m;i++)
{
int c,d,e,f;
cin>>c;
if (c==)
{
cin>>d>>e>>f;
change2(,d,e,f);
}
if (c==)
{
cin>>d>>e>>f;
change1(,d,e,f);
}
if (c==)
{
cin>>d>>e;
cout<<query(,d,e)%mo<<endl;
}
}
return ;
}

ahoi2009维护序列的更多相关文章

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

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

  2. [Luogu 2023] AHOI2009 维护序列

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. bzoj1798 [Ahoi2009]维护序列

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

随机推荐

  1. Redis模块学习笔记(一)RediSearch简单使用

    说明:安装的Redis服务器必须为 4.0 以上版本,通过info命令查看 > INFO redis_version: 一.安装 RediSearch git clone https://git ...

  2. 使用eclipse创建web项目的项目图文步骤

    在eclipse中使用maven ① maven插件:eclipse内置 ②maven插件的设置: [1]installations:指定maven核心程序的位置,不建议使用自带的maven程序而应该 ...

  3. u-boot移植(五)---代码修改---时钟修改、SDRAM

    最开始已经建立了新单板以及配置文件,现在就需要做的是代码的修改,配置成适合目标板使用的u-boot. 一.时钟修改 在代码流程分析中,我们知道,系统的启动是: 设置 CPU 为管理员模式 关闭看门狗 ...

  4. 20155333 2016-2017-2 《Java程序设计》第六周学习总结

    20155333 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的 InputStr ...

  5. 推荐几款在Windows中比较好用的软件

    gif录制软件:LICEcap 下载地址:https://www.cockos.com/licecap/ 演示

  6. mysql 查询优化~sql优化通用

    一 简介:今天我们来探讨下SQL语句的优化基础 二 基础规则: 一 通用: 1 避免索引字段使用函数     2 避免发生隐式转换     3 order by字段需要走索引,否则会发生filesor ...

  7. kali linux 破解wpa密码

    apt-get update apt-get install hostapd-wpe ls -l /etc/hostapd-wpe/ nano /etc/hostapd-wpe/hostapd-wpe ...

  8. Python算法:推导、递归和规约

    Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...

  9. 转载-通俗理解BN(Batch Normalization)

    转自:参数优化方法 1. 深度学习流程简介 1)一次性设置(One time setup)          -激活函数(Activation functions) - 数据预处理(Data Prep ...

  10. Python之matplotlib库学习

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...