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 老师交给小可可一个维护数列的任务,现在小可 ...
随机推荐
- SpringMVC之HelloWorld实例
1.1 Helloworld实例的操作步骤 1. 加入jar包 2. 配置dispatcherServlet 3. 加入Spring配置文件 4. 编写请求处理器 并表示为处理器 5. 编写视图 1 ...
- 什么是 lnmp 实现原理。
LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构. Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统.代表版本有:debian.centos ...
- Node.js爬取豆瓣数据
一直自以为自己vue还可以,一直自以为webpack还可以,今天在慕课逛node的时候,才发现,自己还差的很远.众所周知,vue-cli基于webpack,而webpack基于node,对node不了 ...
- IDEA的Maven依赖如何引入到External Libraries中
现象 在Apollo项目中,遇到了一个问题.当在Module的pom.xml中引入依赖: <dependency> <groupId>com.ctrip.framework.a ...
- PHP die与exit的区别
最近听见有人说die和exit区别,bula~bula.决心一探究竟. 翻了翻PHP 5.6的源码(源码的位置为zend目录下zend_language_scanner.l大约是1014~1020行) ...
- 写好Java代码的30条经验总结(转)
成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的.下面就让我们来看看代码编写的30条建议吧. (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中 ...
- bzoj 3622 已经没有什么好害怕的了 类似容斥,dp
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1213 Solved: 576[Submit][Status][ ...
- OO(Object Oriented)
封装.继承.多态. 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别.封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的代码进行有 ...
- 《设计模式之禅》--备忘录扩展:clone方式的备忘录
接上篇<设计模式之禅>--策略扩展:策略枚举 需求:使用clone方式实现备忘录模式 发起人角色 public class Originator implements Cloneable ...
- Spring 框架系列之事务管理
1.事务回顾 (1).什么是事务: 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. (2).事务特性(ACID) 原子性 :强调事务的不可分割 一致性 :事务的执行的 ...