题目链接

题解

这不就是luogu的线段树2的板子吗。。。。

没有任何的区别。。。

上代码吧。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
#define ll long long
#define lson (now<<1)
#define rson (now<<1|1)
#define MAX 200000
int a[MAX];
int P,N,M;
inline ll read()
{
ll x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node
{
ll val,lc,lj;
}t[MAX*5];
void Build(int now,int l,int r)
{
t[now].lc=1;t[now].lj=0;
if(l==r){t[now].val=a[l]%P;return;}
int mid=(l+r)>>1;
Build(lson,l,mid);
Build(rson,mid+1,r);
t[now].val=(t[lson].val+t[rson].val)%P;
}
void Pushdown(int now,int l,int r)
{
int mid=(l+r)>>1;
int lsize=mid-l+1,rsize=r-mid;
t[lson].val=(t[lson].val*t[now].lc+t[now].lj*lsize)%P;
t[rson].val=(t[rson].val*t[now].lc+t[now].lj*rsize)%P;
t[lson].lc=t[lson].lc*t[now].lc%P;
t[rson].lc=t[rson].lc*t[now].lc%P;
t[lson].lj=(t[lson].lj*t[now].lc+t[now].lj)%P;
t[rson].lj=(t[rson].lj*t[now].lc+t[now].lj)%P;
t[now].lc=1;t[now].lj=0;
}
void Plus(int now,int l,int r,int al,int ar,ll pp)
{
if(al==l&&ar==r)
{
t[now].lj=(t[now].lj+pp)%P;
t[now].val=(t[now].val+(r-l+1)*pp)%P;
return;
}
Pushdown(now,l,r);
int mid=(l+r)>>1;
if(ar<=mid)Plus(lson,l,mid,al,ar,pp);
else if(al>mid)Plus(rson,mid+1,r,al,ar,pp);
else {Plus(lson,l,mid,al,mid,pp);Plus(rson,mid+1,r,mid+1,ar,pp);}
t[now].val=(t[lson].val+t[rson].val)%P;
}
void Multi(int now,int l,int r,int al,int ar,ll pp)
{
if(al==l&&ar==r)
{
t[now].val=(t[now].val*pp)%P;
t[now].lj=(t[now].lj*pp)%P;
t[now].lc=(t[now].lc*pp)%P;
return;
}
Pushdown(now,l,r);
int mid=(l+r)>>1;
if(ar<=mid)Multi(lson,l,mid,al,ar,pp);
else if(al>mid)Multi(rson,mid+1,r,al,ar,pp);
else {Multi(lson,l,mid,al,mid,pp);Multi(rson,mid+1,r,mid+1,ar,pp);}
t[now].val=(t[lson].val+t[rson].val)%P;
}
ll Query(int now,int l,int r,int al,int ar)
{
if(al==l&&ar==r)return t[now].val%P;
Pushdown(now,l,r);
int mid=(l+r)>>1;
ll re=0;
if(ar<=mid)re=Query(lson,l,mid,al,ar)%P;
else if(al>mid)re=Query(rson,mid+1,r,al,ar)%P;
else re=(Query(lson,l,mid,al,mid)+Query(rson,mid+1,r,mid+1,ar))%P;
t[now].val=(t[lson].val+t[rson].val)%P;
return re%P;
}
int main()
{
N=read();P=read();
for(int i=1;i<=N;++i)a[i]=read();
Build(1,1,N);
M=read();
while(M--)
{
int opt=read();int x=read();int y=read();
if(opt==1)
{
ll k=read();
Multi(1,1,N,x,y,k);
}
if(opt==2)
{
ll k=read();
Plus(1,1,N,x,y,k);
}
if(opt==3)
{
printf("%lld\n",Query(1,1,N,x,y)%P);
}
}
return 0;
}

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

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

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

  2. [P2023][AHOI2009]维护序列(线段树)

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

  3. [AHOI2009]维护序列 (线段树)

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

  4. 洛谷 P2023 [AHOI2009]维护序列 || 线段树加法和乘法运算

    原理倒是非常简单.设原数为x,加法的lazytag为b,乘法的lazytag为a,操作数为c,那么原式为ax+b,乘上c后(ax+b)c=(ac)*x+b*c,加上c后(ax+b)+c=ax+(b+c ...

  5. [BZOJ1798][AHOI2009]Seq维护序列 线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 一眼看过去线段树,事实上就是线段树.对于乘和加的两个标记,我们可以规定一个顺序,比如 ...

  6. BZOJ 1798 AHOI2009 Seq 维护序列 线段树

    题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...

  7. 【AHOI2009】 维护序列 - 线段树

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

  8. bzoj1798 [Ahoi2009]维护序列

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

  9. 洛谷 P2023 维护序列——线段树

    先上一波题目 https://www.luogu.org/problem/P2023 复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和 tips:线段树在传标记的时候 优先传乘法标记再传加 ...

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

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

随机推荐

  1. Hive metastore源码阅读(二)

    最近随着项目的深入,发现hive meta有些弊端,就是你会发现它的元数据操作与操作物理集群的代码耦合在一起,非常不利于扩展.比如:在create_table的时候同时进行路径校验及创建,如下代码: ...

  2. httping:测量网站延迟

    遇到网络问题的时候,我们一般会先通过 ping 这个工具来了解基本的情况.httping 与 ping 类似,不过它不是发送 ICMP 请求,而是发送 HTTP 请求.利用 httping,我们可以测 ...

  3. Scrapy-简单介绍

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, ...

  4. Java中简单Http请求

    1. 概述 在这篇快速教程中,我们将使用Java内置类HttpUrlConnection来实现一个Http请求. 2. HttpUrlConnection HttpUrlConnection类允许我们 ...

  5. js中的各种“位置”——“top、clientTop、scrollTop、offsetTop……”,你知道多少

    当要做一些与位置相关的插件或效果的时候,像top.clientTop.scrollTop.offsetTop.scrollHeight.clientHeight.offsetParent...看到这么 ...

  6. linux 安装 sftp

    1,sftp:登陆命令 Xshell:\> sftp root@192.168.159.128 Connecting to 192.168.159.128:22... Connection es ...

  7. web2 - JavaScript

    JavaScript 知识要点 参考教材一 参考教材二 参考教材三 1.JavaScript 和 Java 的关系? 2.JavaScript 在编程中可以做什么? 3.如何在 html 中使用 Ja ...

  8. CodeForces-747E

    这几天好懒,昨天写的题,今天才来写博客.... 这题你不知道它究竟有多少层,但是知道字符串长度不超过10^6,那么它的总容量是被限定的,用一个二维动态数组就OK了.输入字符串后,可以把它按照逗号分割成 ...

  9. SpringBoot+gradle+idea实现热部署和热加载

    前言 因为之前使用myeclipes的同学就知道,在使用myeclipes的时候,java文件或者jsp文件写完之后会被直接热加载到部署的容器中,从而在开发的时候,不同经常去重启项目,从而达到了增加开 ...

  10. 网络基础tcp/ip协议三

    数据链路层:(位于网络层与物理层之间) 数据链路层的功能: 数据链路的建立,维护. 帧包装,帧传输,帧同步. 帧的差错恢复. 流量的控制. 以太网:(工作在数据链路层) CSMA/CD(带冲突检测的载 ...