BZOJ1798[Ahoi2009]维护序列——线段树
题目描述
输入
输出
样例输入
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7
样例输出
35
8
提示
【样例说明】
初始时数列为(1,2,3,4,5,6,7)。 经过第1次操作后,数列为(1,10,15,20,25,6,7)。 对第2次操作,和为10+15+20=45,模43的结果是2。 经过第3次操作后,数列为(1,10,24,29,34,15,16} 对第4次操作,和为1+10+24=35,模43的结果是35。 对第5次操作,和为29+34+15+16=94,模43的结果是8。
测试数据规模如下表所示
数据编号 1 2 3 4 5 6 7 8 9 10 N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000 M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
这是一道进阶板的线段树模板,因为有加有乘,所以要注意运算顺序,要先乘再加,每个点维护的区间和都是一个kx+b的形式。
具体操作看代码吧。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long a[1000000];
long long s[1000000];
long long sum[1000000];
int n,m;
int p;
int x,y,k;
int opt;
void updata(int rt)
{
sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%p;
}
void build(int rt,int l,int r)
{
s[rt]=1;
if(l==r)
{
scanf("%d",&sum[rt]);
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
updata(rt);
}
void sign(int rt,int l,int r)
{
int mid=(l+r)>>1;
sum[rt<<1]=(sum[rt<<1]*s[rt]%p+a[rt]*(mid-l+1)%p)%p;
sum[rt<<1|1]=(sum[rt<<1|1]*s[rt]%p+a[rt]*(r-mid)%p)%p;
s[rt<<1]=s[rt]*s[rt<<1]%p;
s[rt<<1|1]=s[rt]*s[rt<<1|1]%p;
a[rt<<1]=(a[rt<<1]*s[rt]+a[rt])%p;
a[rt<<1|1]=(a[rt<<1|1]*s[rt]+a[rt])%p;
a[rt]=0;
s[rt]=1;
}
void change(int rt,int l,int r,int L,int R,int v,int x)
{
if(L<=l&&r<=R)
{
if(x==1)
{
s[rt]=s[rt]*v%p;
a[rt]=a[rt]*v%p;
sum[rt]=sum[rt]*v%p;
}
else
{
a[rt]=(a[rt]+v)%p;
sum[rt]=(sum[rt]+v*(r-l+1))%p;
}
return ;
}
sign(rt,l,r);
int mid=(l+r)>>1;
if(L<=mid)
{
change(rt<<1,l,mid,L,R,v,x);
}
if(R>mid)
{
change(rt<<1|1,mid+1,r,L,R,v,x);
}
updata(rt);
}
long long query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
sign(rt,l,r);
long long tot=0;
int mid=(l+r)>>1;
if(L<=mid)
{
tot+=query(rt<<1,l,mid,L,R);
tot%=p;
}
if(R>mid)
{
tot+=query(rt<<1|1,mid+1,r,L,R);
tot%=p;
}
return tot%p;
}
int main()
{
scanf("%d%d",&n,&p);
build(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%d",&x,&y,&k);
change(1,1,n,x,y,k,1);
}
else if(opt==2)
{
scanf("%d%d%d",&x,&y,&k);
change(1,1,n,x,y,k,2);
}
else
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,1,n,x,y));
}
}
}
BZOJ1798[Ahoi2009]维护序列——线段树的更多相关文章
- [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 ...
随机推荐
- C#位运算实际运用
前言 前几天写了一篇关于c#位操作,c#位运算基本概念与计算过程 最后提到一个实际问题 需求:C# 用两个short,一个int32拼成一个long型 要求:现在有两个short和一个int,需要拼成 ...
- jmeter(十八)关联之XPath Extractor
之前的博客,有介绍jmeter如何对请求进行关联的一种常见用法,即:后置处理器中的正则表达式提取器,下面介绍另一种关联方法,XPath Extractor! 所谓关联,从业务角度讲,即:某些操作步骤与 ...
- TCP/IP协议--TCP的交互数据流和成块数据流
前边讲了TCP连接的建立和终止,分别要三次握手和四次通信.这些报文段都只包含首部,没有数据部分. 这里就讲讲数据传送的一些细节.一个TCP连接建立成功以后,就可以开始传送数据了~ 一般TCP数据 ...
- React-页面路由参数传递的两种方法
list页->detail页 方法一:路由参数 路由导航: 用“/” <Link to={'/detail/'+item.get('id')} key={index}> 路由map: ...
- dpkg打包与解包
1.打包 dpkg -b 2.解包 2.1 dpkg -X 解出包内容 2.2 dpkg -e 输出包控制信息
- (一)在 Blend 中绘制形状和路径
原文:(一)在 Blend 中绘制形状和路径 https://docs.microsoft.com/zh-cn/previous-versions/jj170881(v=vs.120) 在 Blend ...
- [Oracle]GoldenGate官方文档
Extracting Data in Oracle GoldenGate Integrated Capture Mode http://www.oracle.com/technetwork/datab ...
- synchronized和Lock的异同
JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock.其中,synchronized使用Object对象本身的notify.wait.notifyAll调度机制,而l ...
- 基于DDD的.NET开发框架ABP实例,多租户 (Saas)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍
介绍 基于ABPZERO的多租户 (Saas)应用程序,采用ASP.NET MVC, Angularjs-介绍 ASP.NET Boilerplate作为应用程序框架. ASP.NET MVC和ASP ...
- Openstack部署踩坑
第一周: 使用kola部署Openstack,vip_address有问题,双网上也不行,就是部署不了,但all-in-one却可以,可是节点不会加. 第二周: 使用Packstack部署Openst ...