BZOJ 5039: [Jsoi2014]序列维护
5039: [Jsoi2014]序列维护
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 282 Solved: 169
[Submit][Status][Discuss]
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
【样例说明】
初始时数列为(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。

/**************************************************************
Problem: 5039
User: Hammer_cwz_77
Language: C++
Result: Accepted
Time:6100 ms
Memory:10276 kb
****************************************************************/ #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL mod;
struct node
{
int l,r,lc,rc;
LL c;
LL mul,add;
bool lazy;
node(){lazy=false;}
}tr[];int trlen;
int n,m;int x[];
void bt(int l,int r)
{
int now=++trlen;
tr[now].l=l;tr[now].r=r;
tr[now].lc=tr[now].rc=-;tr[now].c=;
tr[now].mul=;tr[now].add=;
if(l==r){tr[now].c=x[l]%mod;return ;}
if(l<r)
{
int mid=(l+r)/;
tr[now].lc=trlen+; bt(l,mid);
tr[now].rc=trlen+; bt(mid+,r);
}
tr[now].c=tr[tr[now].lc].c+tr[tr[now].rc].c;
}
void lazy(int x)
{
int lc=tr[x].lc,rc=tr[x].rc;
int l=tr[x].l,r=tr[x].r;int mid=(l+r)/;
if(lc!=-)
{
tr[lc].c=(tr[lc].c*tr[x].mul)%mod;
tr[lc].c=(tr[lc].c+tr[x].add*(mid-l+))%mod;
tr[lc].mul=(tr[lc].mul*tr[x].mul)%mod;
tr[lc].add=(tr[lc].add*tr[x].mul)%mod;
tr[lc].add=(tr[lc].add+tr[x].add)%mod;
}
if(rc!=-)
{
tr[rc].c=(tr[rc].c*tr[x].mul)%mod;
tr[rc].c=(tr[rc].c+tr[x].add*(r-mid))%mod;
tr[rc].mul=(tr[rc].mul*tr[x].mul)%mod;
tr[rc].add=(tr[rc].add*tr[x].mul)%mod;
tr[rc].add=(tr[rc].add+tr[x].add)%mod;
}
tr[x].mul=;tr[x].add=;
}
void change_x(int now,int l,int r,LL c)//l~r +c
{
if(tr[now].l==l && tr[now].r==r)
{
tr[now].c=(tr[now].c+(r-l+)*c)%mod;
tr[now].add=(tr[now].add+c)%mod;
return ;
}
int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/;
lazy(now);
if(r<=mid)change_x(lc,l,r,c);
else if(mid+<=l)change_x(rc,l,r,c);
else
{
change_x(lc,l,mid,c);
change_x(rc,mid+,r,c);
}
tr[now].c=(tr[lc].c+tr[rc].c)%mod;
}
void change_a(int now,int l,int r,LL c)//l~r *c
{
if(tr[now].l==l && tr[now].r==r)
{
tr[now].c=(tr[now].c*c)%mod;
tr[now].mul=(tr[now].mul*c)%mod;
tr[now].add=(tr[now].add*c)%mod;
return ;
}
int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/;
lazy(now);
if(r<=mid)change_a(lc,l,r,c);
else if(mid+<=l)change_a(rc,l,r,c);
else
{
change_a(lc,l,mid,c);
change_a(rc,mid+,r,c);
}
tr[now].c=(tr[lc].c+tr[rc].c)%mod;
}
LL findsum(int now,int l,int r)
{
if(tr[now].l==l && tr[now].r==r)
{
lazy(now);
return tr[now].c%mod;
}
int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/;
lazy(now);
if(r<=mid)return findsum(lc,l,r);
else if(mid+<=l)return findsum(rc,l,r);
else return ((findsum(lc,l,mid)%mod+findsum(rc,mid+,r)%mod)%mod);
}
int main()
{
scanf("%d%lld",&n,&mod);
for(int i=;i<=n;i++)scanf("%d",&x[i]);
trlen=;bt(,n);
scanf("%d",&m);
while(m--)
{
int q,t,g;LL c;
scanf("%d%d%d",&q,&t,&g);
if(q==){printf("%lld\n",findsum(,t,g)%mod);continue;}
scanf("%lld",&c);
if(q==)change_a(,t,g,c);
else change_x(,t,g,c);
}
return ;
}
---恢复内容结束---
BZOJ 5039: [Jsoi2014]序列维护的更多相关文章
- bzoj5039:[Jsoi2014]序列维护
做做bzoj上的新题(不存在的) 同bzoj1798: [Ahoi2009]维护序列,样例都一样的...我能想象到的唯一的新的考察意义就是模数是2e9不是1e9,于是加法的时候需要转long long ...
- 「JSOI2014」序列维护
「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...
- [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...
- (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作
二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- BZOJ 1798 AHOI2009 Seq 维护序列 线段树
题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
随机推荐
- HTTP入门
请求报文图解: 请求报文 图片 响应报文图解: 响应报文
- CSS中可以继承和不可继承的常见属性
一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...
- 架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)
本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...
- [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio
<<返回目录 Visual Studio vs虽然不是全宇宙唯一的IDE,但它是.net开发人员最常用的开发工具.它自带一个性能分析工具,你可以使用它来做开发,不同的vs版本在工具上会略有 ...
- Spring实现无需注解实现自动注入
xml配置 过程:设置自动装配的包-->使用include-filter过滤type选择为regex为正则表达式-->expression是表达是式也就是限制条件 <?xml ver ...
- 使用tdload工具将本地数据导入到Teradata数据库中
想把本地的数据文件(比如txt.csv)中的数据导入到Teradata虚拟机中的表中.既可以使用Teradata Assistant中的import功能,也可以使用fastload导入,前者的缺点是一 ...
- java3 - 流程控制
一.Java 有三种主要的循环结构: 需求:分别使用三种循环将 1 到 100 的整数输出到控制台. 1.for 循环 for(初始化语句; 布尔表达式语句; 更新语句) { //循环体内容 } 示列 ...
- R学习笔记:了解R的使用
R是一种区分大小写的解释性语言,只支持单行注释,注释由符号#开头,当前行出现在#之后的任何文本都会被R解释器忽略.R脚本的一次执行叫做一个会话(Session),可以通过函数quit()退出当前的会话 ...
- Linux上查看用户名和组并把特定用户放到特定的组之下
cat /etc/passwd //查看所有的用户信息 cat /etc/passwd|grep 用户名 //查看某一个用户的信息 cat /etc/group ...
- 在Centos环境下安装兼容Apache2.4高版本SVN服务
在阿里云Centos环境下,搭建PHP运行环境,PHP选择了php7版本,Mysql选择了5.7版本,Apache选择了2.4版本,在搭建SVN版本控制服务过程中出现了不兼容问题,当前环境下Apach ...