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 ...
随机推荐
- 高显卡安装 低版本的ubuntu系统导致hdmi线不能用
- nginx-haproxy-lvs功能和性能对比 nginx - max-fail + 调度算法
优点(性能和功能两方面分析) 缺点 lvs 工作在4层,可以对http,MySQL等服务负载均衡.负责流量的分发,对io,cpu,mem的消耗少 功能比较少,没有正则匹配的功能 nginx 工作在7层 ...
- 浅析单点登录,以及不同二级域名下的SSO实现
一家公司有多个产品线,就可能要有多个子域名,下头以baidu域名为例,a.baidu.com, b.baidu.com.com 是顶级域名,baidu 就是一个二级域名,a和b就是子域名. 当用户在a ...
- Luogu3352 ZJOI2016 线段树 概率、区间DP
传送门 考虑对于每一个位置\(i\),计算所有可能的结果出现的概率. 定义一个区间\([l,r]\)为对于\(x\)的极大区间,当且仅当\(\max \limits _{i=l}^r \{a_i\} ...
- SQL SERVER中DBLINK的实现
exec sp_addlinkedserver 'CantennFlexPsApp' , '' , 'SQLOLEDB' , '目标数据库的IP' exec sp_addlinkedsrvlogin ...
- Spring boot多模块(moudle)中的一个注入错误(Unable to start embedded container; nested exception is org)
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested ...
- Java开源博客My-Blog之mysql容器重复初始化的严重bug修复过程
写在前面的话 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> <Java开源博客My-Blog之docker容器组件化修改> ...
- Centos7 中文乱码
1. 安装中文库 yum groupinstall "fonts" 2. 检查是否有中文语言包 locale -a 3. 查看当前系统语言环境 locale 解析如下 LANG:当 ...
- box-flex 弹性合布局+WebApp布局自适应
问:随着屏幕改变,中间自适应 两边固定宽度? 参考: nec 布局 四种方法--博客园 问:左侧导航栏隐藏后,右侧内容宽度自动(响应式)变大? <!DOCTYPE html> <ht ...
- PLSQL使用技巧 如何设置默认显示My Objects、记住密码等
https://www.cnblogs.com/yilinzi/p/7144852.html PL/SQL Developer实现双击table查询 https://blog.csdn.net/zhy ...