题目链接

题解

这不就是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. angular+require前端项目架构搭建

    app //应用入口 directive //自定义指令 require-main //require的主配置文件  存放公共调用的js service //请求后端数据公有类 controllers ...

  2. java8 - IO

    一.学习大纲: 1. 字符编码格式 2. 文件操作(实现文件的增.删.改.查等操作) 3. 目录操作(实现目录的增.删.改.查等操作) 4. 数据传输(实现对文件内容的读.写等操作) 二.关联类: 1 ...

  3. shiro框架的使用实例

    文档路径(包括数据库结构):https://pan.baidu.com/s/1eRP14AI

  4. 【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码

    一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H ...

  5. Docker系列三:Docker容器管理

    Docker容器管理 1. 单一容器管理 1) 容器的启动 $ docker run --name gitlab-redis -d --volume /srv/docker/gitlab/redis: ...

  6. linux ftp及C/S服务架构

    乱码转换工具使用convmv软件:windows中文字符编码为GB2312 linux中文字符编码为utf-8选项:-f:源文件中中文字符编码-t:转换成字符编码-r:代表递归--notest:不测试 ...

  7. Java中对整数格式化

    Java中对整数格式化 1.说明    对整数进行格式化:%[index$][标识][最小宽度]转换方式 2.实例分析 (1)源码 /** * 1. 对整数进行格式化:%[index$][标识][最小 ...

  8. DirectX:在graph自动连线中加入自定义filter(graph中遍历filter)

    为客户提供的视频播放的filter的测试程序中,采用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791),由于不同的视频压缩 ...

  9. 【译】gRPC负载均衡

    原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. ...

  10. Django学习-11-请求相关信息

    requests对象是由类创建的 from django.core.handlers.wsgi import WSGIRequest    --> 类 request.environ中封装了请求 ...