还是那个学弟@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. 学号:201621123032 《Java程序设计》第9周学习总结(

    1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...

  2. 在深度linux下安装pip3与jupyter

    前言 以下安装说明基于已经正确安装python3 文件下载 https://pypi.python.org/pypi/pip 下载pip-9.0.1.tar.gz (md5, pgp)文件 安装准备工 ...

  3. 多线程socket UDP收发数据

    多线程socket收发数据 from threading import Thread from socket import * def sendData(): while True: sendInfo ...

  4. div+css命名规则

    作为一个前端菜鸟,进公司的第一个项目就是中途从外包公司接过来的公司网站,在别人写过了的基础上接着写,命名什么的,简直不要太痛苦. 目前,这个网站已经完成,但是被后台人员指出命名不规范.有心想解释一两句 ...

  5. mysql5.5中datetime默认值不能为NOW或者CURRENT_TIMESTAMP,用触发器解决

    mysql5.6及以上的版本datatime默认值可以为CURRENT_TIMESTAMP或者NOW 那我们要用的是mysql5.5及以下版本呢? 请看代码 delimiter // DROP TRI ...

  6. JMeter入门(01)概念和样例

    一.概念 JMeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台,实现了许多和互联网相关的网络测试组件,同时还保留着很强的扩展性. JMeter可以用来测试诸如:静态文件,Java Ser ...

  7. Linux实战案例(2)实例讲解使用软连接的场景和过程

    =================================== 使用场景:使用软连接简化版本切换动作 进入操作目录, cd /opt/modules/ ==================== ...

  8. Java-NIO(七):阻塞IO与非阻塞IO

    阻塞IO 传统的 IO 流都是阻塞式的. 也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因此,在完成网络通信 ...

  9. js通过class获取元素时的兼容性解决方案

    1:::::方法代码如下:function getByClass(sClass){    var aResult=[];    var aEle=document.getElementsByTagNa ...

  10. 使用java客户端调用redis

    Redis支持很多编程语言的客户端,有C.C#.C++.Clojure.Common Lisp.Erlang.Go.Lua.Objective-C.PHP.Ruby.Scala,甚至更时髦的Node. ...