【BZOJ1798】【AHOI2009】维护序列(线段树)
题解
这不就是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】维护序列(线段树)的更多相关文章
- BZOJ1798[Ahoi2009]维护序列——线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- [P2023][AHOI2009]维护序列(线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- [AHOI2009]维护序列 (线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- 洛谷 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 ...
- [BZOJ1798][AHOI2009]Seq维护序列 线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 一眼看过去线段树,事实上就是线段树.对于乘和加的两个标记,我们可以规定一个顺序,比如 ...
- BZOJ 1798 AHOI2009 Seq 维护序列 线段树
题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...
- 【AHOI2009】 维护序列 - 线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- 洛谷 P2023 维护序列——线段树
先上一波题目 https://www.luogu.org/problem/P2023 复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和 tips:线段树在传标记的时候 优先传乘法标记再传加 ...
- 【线段树】Bzoj1798 [AHOI2009] 维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
随机推荐
- angularjs中类似textarea的换行、空格处理
背景 今天测试人员测试出来一个显示数据的页面,没有换行. 原因剖析 这个页面是从一个<textarea>的页面拿到的数据,存到数据库中后再返回来的. 1. 知道这点之后,就有了调查方向了: ...
- Vi/Vim的快捷方式
1 vi/ vim键盘图 2 文字解说 进入编辑模式的6种方式: i在光标前插入 I在行首插入 a在光标后插入 A在行末插入 o在下一行插入 O在上一行插入 删除字符 x 删除当前字符 X 删除前一个 ...
- CentOS 7 使用iptables防火墙
# 停止firewalld服务 systemctl stop firewalld systemctl mask firewalld # 安装iptables-services yum install ...
- Lua内存分析工具
最近给公司写了一个lua内存分析工具,可以非常方便的分析出Lua内存泄露问题,有图形化界面操作,方便手机端上传快照等功能 内存分析我是在c语言端写的,也有人写过lua端的分析工具,也蛮好用的,不过lu ...
- 框架学习笔记之Maven简介和配置
一.什么是Maven?★Maven可翻译为“知识的积累”.“专家”.“内行”,它是一个跨平台的项目管理工具.★Maven提供了开发人员构建一个完整的生命周期框架,开发团队可以自动完成项目的基础工具建设 ...
- 项目构建工具Maven
- ERROR namenode.NameNode: Failed to start namenode. java.lang.IllegalArgument
这个问题一般是配置文件配置没有配置好的原因
- Django 学习笔记
day 1 : 一.web 框架本质: 1.http 建立在tcp 之上:一次互通后断开,无状态,短链接 请求头: b'GET / HTTP/1.1 Host: 127.0.0.1:8080 Conn ...
- Servlet中forward和redirect的区别(转)
forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response); red ...
- 【前端】Vue2全家桶案例《看漫画》之五、引入axios
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html 项目github地址:https://github.com/shamoyuu/ ...