题目链接

题解

这不就是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. window MySQL解压缩版部署及配置

    MySQL安装分为解压文件和直接安装.exe文件 我在官网下载的是解压文件 官网下载地址https://dev.mysql.com/downloads/mysql/ 一.MySQL部署 1.将下载下来 ...

  2. 2个域名重定向到https域名

    配置实例: [root@iZbp17q09o7e8pgg9dybd7Z conf.d]# cat company.confserver { listen 80; server_name www.yu* ...

  3. scp的简单记忆方法

    scp虽然只有把文见发送到远端和从远端copy文件俩功能,但是常常把俩功能的先写什么给计混了,所以我就用通俗的大白话给总结了下,十分容易记忆,这里给大家分享一下.scp 我们常用的两个功能: (1)把 ...

  4. Linux Centos下编译安装Redis

    需要安装 tcl 8.5 wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz //直接下载 sudo tar xzvf tcl8 ...

  5. ACdream 1015 Double Kings 树的重心

    思路:删除根结点,其最大子树的节点最少.求一次树的重心即可. AC代码 #include <cstdio> #include <cmath> #include <ccty ...

  6. OpenCV 之 空间滤波

    1  空间滤波 1.1  基本概念 空间域,在图像处理中,指的是像平面本身: 空间滤波,则是在像平面内,对像素值所进行的滤波处理. 如上图所示,假设点 (x, y) 为图像 f 中的任意点,中间正方形 ...

  7. java遍历的优化

    说明:这是在面试中面试官出的题.虽然是常见的优化问题,但这种经验的确很有用.感慨之余,分享出来,以此共勉. 场景:现有List<PersonA>,List<PersonB>,P ...

  8. SpringBoot实战 之 异常处理篇

    在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然 ...

  9. IS-IS 路由协议 总结

    第一章 is-is的协议概述 1. 发展史 Is-is最早是iso为osi模型中CLNP而设计的协议,后来根据发展需要,也支持了TCP/IP协议,因此,is-is叫做integrated is-is或 ...

  10. java线程池技术(二): 核心ThreadPoolExecutor介绍

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程池技术属于比较"古老"而又比较基础的技术了,本篇博客主要作用是个人技术梳理,没什么新玩意. 一.Java线程池技术的 ...