还是那个学弟@lher出的丧题之一。

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798

题意简析:就是题目啊。。。

解题思路:显然是线段树啊。。。根据乘法分配律处理一下区间乘法操作,其他就是简单的区间加法查询,很水吧owo。时间效率\(O(m \lg n) \)。

附AC代码:

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define ll long long
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
using namespace std;
struct zxy{
ll val,mult,add;
}tr[];
int n,mod,q;
inline int in(){
int x=,f=;
char ch=getchar();
while(ch<''||ch>'') {if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x*f;
}
inline void pushdown(int k,int l,int r){
if (tr[k].mult==&&!tr[k].add) return;
int D=(r-l)+;
tr[ls].add=(tr[ls].add*tr[k].mult+tr[k].add)%mod;
tr[rs].add=(tr[rs].add*tr[k].mult+tr[k].add)%mod;
tr[ls].mult=(tr[ls].mult*tr[k].mult)%mod;
tr[rs].mult=(tr[rs].mult*tr[k].mult)%mod;
tr[ls].val=(tr[ls].val*tr[k].mult+(D-(D>>))*tr[k].add)%mod;
tr[rs].val=(tr[rs].val*tr[k].mult+(D>>)*tr[k].add)%mod;
tr[k].mult=,tr[k].add=;
}
inline void combine(int k){
tr[k].val=(tr[ls].val+tr[rs].val)%mod;
}
inline void update(int k,int l,int r,int a,int b,int mult,int add){
if (l>=a&&r<=b){
tr[k].mult=tr[k].mult*mult%mod;
tr[k].add=(tr[k].add*mult+add)%mod;
tr[k].val=(tr[k].val*mult+(r-l+)*add)%mod;
return;
}
pushdown(k,l,r);
if (a<=mid) update(ls,l,mid,a,b,mult,add);
if (b>mid) update(rs,mid+,r,a,b,mult,add);
combine(k);
}
inline ll query(int k,int l,int r,int a,int b){
if (l==a&&r==b) return tr[k].val%mod;
pushdown(k,l,r);
if (b<=mid) return query(ls,l,mid,a,b);
if (a>mid) return query(rs,mid+,r,a,b);
return (query(ls,l,mid,a,mid)+query(rs,mid+,r,mid+,b))%mod;
}
inline void built(int k,int l,int r){
tr[k].mult=; tr[k].add=;
if(l==r) {
tr[k].val=in();
return;
}
built(ls,l,mid);built(rs,mid+,r);
combine(k);
}
int main(){
n=in(),mod=in(); built(,,n);
q=in();
for (register int i=; i<=q; ++i){
int typ=in(),l=in(),r=in();
if (typ==) update(,,n,l,r,,in());
if (typ==) update(,,n,l,r,in(),);
if (typ==)printf("%lld\n",query(,,n,l,r));
}
return ;
}

本文由Melacau编写,Melacau代表M星向您问好,如果您不是在我的博客http://www.cnblogs.com/Melacau上看到本文,请您向我联系,email:13960948839@163.com.

【线段树】【BZOJ1798】【AHOI2009】维护序列的更多相关文章

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

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

  2. bzoj1798 [Ahoi2009]维护序列

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

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

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

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

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

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

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

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

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

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

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

  8. [Luogu 2023] AHOI2009 维护序列

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

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

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

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

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

随机推荐

  1. 【iOS】Swift if let 和 if var

    if let unwrappedOptional = postDict { print("The optional has a value! It's \(unwrappedOptional ...

  2. JVM笔记7-内存分配与回收策略

    1.对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配.当Eden区中没有足够空间分配时,虚拟机将发起一次Minor GC.虚拟机提供了-XX:PrintGCDetails 这个收集器 ...

  3. ajax实现无刷新分页效果

    基于jquery.pagination.js实现的无刷新加载分页数据效果. 简介与说明 * 该插件为Ajax分页插件,一次性加载数据,故分页切换时无刷新与延迟.如果数据量较大,加载会比较慢. * 分页 ...

  4. JAVA_SE基础——21.二维数组的定义

    2 二维数组的定义 基本与一维数组类似 //定义一个3行5列的二维数组 //方法1,先new对象,然后再初始化每个元素 int[][] a = new int[3][5]; a[0][0]=1; a[ ...

  5. 第三章 JavaScript操作BOM对象

    第三章   JavaScript操作BOM对象 一.window对象 浏览器对象模型(BOM)是javascript的组成之一,它提供了独立与浏览器窗口进行交换的对象,使用浏览器对象模型可以实现与HT ...

  6. HTTP协议扫盲(七)请求报文之 GET、POST-FORM 和 POST-FILE

    一.get 1.页面代码 2.请求报文 3.小结 get请求没有报文体,所以请求报文没有content-type url上的query参数param11=val11&param12=val12 ...

  7. java中的interface

    转载: Java不支持多重继承,即一个类只能有一个父类 为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口 接口是抽象方法和常量值定义的集合,是一种特殊的抽象类接口中只包含常量和方法的定 ...

  8. django模版中配置和使用静态文件方法

    1 在项目根路径下创建静态文件目录static: test3 是我的项目名,根目录下面: booktest 是一个应用 static是我建立的静态文件目录(这个名字其实可以叫其他的),静态文件都放在这 ...

  9. SourceTree 03 - 跳过账号登录直接进入主界面

    SourceTree系列第1篇 SourceTree 01 - git 客户端介绍(http://www.cnblogs.com/geaosu/p/8807666.html) SourceTree系列 ...

  10. 文本处理三剑客之sed

    sed 1.简介 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(patternspace),接着用sed命令处理缓冲区中的内 ...