BZOJ1798 AHOI2009 维护数列
1798: [Ahoi2009]Seq 维护序列seq
Time Limit: 30 Sec Memory Limit: 64 MB
Description
Input
Output
Sample Input
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
Sample Output
35
8
HINT
【样例说明】
初始时数列为(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
迷醉线段树题。
这特么明显的线段树裸题,10w的数据,多组询问,支持区间修改和求和。
所以就是在lazy标记上做文章。
维护两个lazy标记,一个乘一个加。
因为要满足运算符优先级,所以乘法必须马上实现在加法上。
也就是说乘法的时候把加法的lazy也乘一遍。
所以lazy的乘法操作都是当前节点已经搞完了的。
那么lazy的下放就是要先乘再加了,不然会乘重复。
理清楚优先级的限制之后很好做的。(真的吗?)
反正我感觉乘的lazy就是加的lazy的lazy,除了一些维护答案的地方外... ...
感觉越说越不清楚,代码糊上。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <complex>
#include <stack>
#define ls (x<<1)
#define rs (x<<1|1)
#define LL long long int
#define dob double
using namespace std; const int N = 100010;
int n,P,m,T[N<<2],lazy_A[N<<2],lazy_M[N<<2]; int gi()
{
int x=0,res=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')res*=-1;ch=getchar();}
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
} inline void build(int x,int l,int r){
if(l==r){T[x]=gi();return;}
int mid=(l+r)>>1;
build(ls,l,mid);build(rs,mid+1,r);
T[x]=(T[ls]+T[rs])%P;
lazy_A[x]=0;lazy_M[x]=1;
} inline void down(int x,int l,int r){
int mid=(l+r)>>1;
T[ls]=(1ll*T[ls]*lazy_M[x]+1ll*(mid-l+1)*lazy_A[x])%P;
T[rs]=(1ll*T[rs]*lazy_M[x]+1ll*(r-mid)*lazy_A[x])%P;
lazy_M[ls]=(1ll*lazy_M[ls]*lazy_M[x])%P;
lazy_M[rs]=(1ll*lazy_M[rs]*lazy_M[x])%P;
lazy_A[ls]=(1ll*lazy_A[ls]*lazy_M[x]+1ll*lazy_A[x])%P;
lazy_A[rs]=(1ll*lazy_A[rs]*lazy_M[x]+1ll*lazy_A[x])%P;
lazy_A[x]=0;lazy_M[x]=1;
return;
} inline void Mul(int x,int l,int r,int xl,int xr,int v){
if(l==xl && r==xr){
lazy_A[x]=1ll*lazy_A[x]*v%P;
lazy_M[x]=1ll*lazy_M[x]*v%P;
T[x]=1ll*T[x]*v%P;
return;
}
down(x,l,r);
int mid=(l+r)>>1;
if(xr<=mid)Mul(ls,l,mid,xl,xr,v);
else if(xl>mid)Mul(rs,mid+1,r,xl,xr,v);
else Mul(ls,l,mid,xl,mid,v),Mul(rs,mid+1,r,mid+1,xr,v);
T[x]=(T[ls]+T[rs])%P;
} inline void Add(int x,int l,int r,int xl,int xr,int v){
if(l==xl && r==xr){
lazy_A[x]=(lazy_A[x]+v)%P;
T[x]=(1ll*T[x]+1ll*(r-l+1)*v)%P;
return;
}
down(x,l,r);
int mid=(l+r)>>1;
if(xr<=mid)Add(ls,l,mid,xl,xr,v);
else if(xl>mid)Add(rs,mid+1,r,xl,xr,v);
else Add(ls,l,mid,xl,mid,v),Add(rs,mid+1,r,mid+1,xr,v);
T[x]=(T[ls]+T[rs])%P;
} inline int query(int x,int l,int r,int xl,int xr){
if(l==xl && r==xr)return T[x];
down(x,l,r);
int mid=(l+r)>>1;
if(xr<=mid)return query(ls,l,mid,xl,xr);
else if(xl>mid)return query(rs,mid+1,r,xl,xr);
else return (query(ls,l,mid,xl,mid)+query(rs,mid+1,r,mid+1,xr))%P;
} int main()
{
n=gi();P=gi();
build(1,1,n);
m=gi();
while(m--){
int type=gi();
if(type==1){
int l=gi(),r=gi(),c=gi();
Mul(1,1,n,l,r,c);
}
if(type==2){
int l=gi(),r=gi(),c=gi();
Add(1,1,n,l,r,c);
}
if(type==3){
int l=gi(),r=gi();
printf("%d\n",query(1,1,n,l,r));
}
}
return 0;
}
BZOJ1798 AHOI2009 维护数列的更多相关文章
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- 【线段树】Bzoj1798 [AHOI2009] 维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- BZOJ1798[Ahoi2009]维护序列——线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- 洛谷 P2023 [AHOI2009]维护序列
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 【bzoj1500】 noi2005—维护数列
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 (题目链接) 题意 要求维护数列,操作有区间删除,区间插入,区间反转,区间修改,区间求和,求最 ...
随机推荐
- C# winform 程序开发知识点总结(干货)
1.数据库连接及操作 在说数据库操作之前,先说一下数据库连接操作字符串的获取 首先,点击服务器资源管理器,接下来选中数据连接右键点击添加连接,填入你要连接的服务器名称,点击单选框使用SQL Serve ...
- 最耗性能的SQL语句
设计优化–常见杀手级SQL •SELECT * vsSELECT col1, col2 •ORDER BY RAND() •LIMIT huge_num, offset •SELECT COUNT(* ...
- 2810:完美立方-poj
2810:完美立方 总时间限制: 1000ms 内存限制: 65536kB 描述 形如a3= b3 + c3 + d3的等式被称为完美立方等式.例如123= 63 + 83 + 103 .编写一个 ...
- [flask实践] 解决qq邮箱/mysql的相关配置问题
笔者经过flask web(Miguel著,封面是一条狗)一书的学习,打算实现一个旅游类网站,在此过程中发现,相对于书中的flasky博客程序,需要作出一些改变: 1. 注册邮箱:国内要使用126,q ...
- 【二十二】mysqli事务处理
事务处理 事务基本原理 如果不开启事务,执行一条sql,马上会持久化数据.可见:默认的mysql对sql语句的执行是自动提交的! 如果开启了事务,就是关闭了自动提交的功能,改成了commit执行自动提 ...
- Servlet实践--留言板-v1
功能介绍: 由三个jsp页面组成,在doGet中根据请求URL中的请求参数不同,跳转到不同的页面: 页面1:显示整个留言板列表 页面2:创建留言页面(包括用户.主题.内容和上传文件) 页面3:在查看单 ...
- IIS网站本机可以访问但局域网其他机器无法访问 解决方法
在IIS部署网站的时候,发现只有本机可以访问,通过localhost和IP地址都可以,但是当局域网其他机器访问我的网站的时候,无响应. 我的是WIN10的系统 解决方法: 网站所对应的端口必须对外 ...
- ssm开发关于web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...
- JAVA字符串转换MD5值
简介: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5 ...
- PHP 使用Echarts生成数据统计报表
echarts统计,心血来潮~~ 先看下效果图 看下代码 HTML页面 为ECharts准备一个Dom,宽高自定义 <div class="panel panel-info" ...