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 老师交给小可可一个维护数列的任务,现在小可 ...
随机推荐
- react小结
react基础小结 1. 例子 import React from 'react' import { render } from 'react-dom' // 定义组件 class Hello ext ...
- Qt滑动条设计与实现
没有找到Qt的滑动条控件,所以自己写了一个,能够实现亮度调节.音量调节等功能. 效果如下图: 主要设计思路: 有些调节功能如对比度是有负值的,所以需要能对滑动条的数值范围进行设置,不局限于0~100 ...
- java程序设计原则
前言: 前言:java这种面向对象的的语言其实是很符合人的生活思维模式的,因为它以对象作为自己的研究对象,所谓"万物皆对象".一个人.一颗苹果.一只蚂蚁都是对象.所以它的设计原则和 ...
- egametang启动配置
egametang的启动配置文件可以在Unity的Tools->命令行配置中修改保存然后启动 如果需要添加自定义的启动配置项目,只需要修改客户端的 ServerCommandLineEditor ...
- 解析JavaScript函数的多种写法
本文主要分析了JavaScript中函数的几种写法,具体如下: 1.函数的声明和表达式(旧方法,也是最常见的方法) 2.通过Function构造器 这也是一种从一开始就存在方法,但是因为书写麻烦等原因 ...
- bzoj 2120 带修改莫队
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 7340 Solved: 2982[Submit][Status][Discuss] ...
- Hibernate学习(一)创建数据表
(1)生成数据库表的创建: // 默认读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); // 生成并 ...
- GCC精彩之旅_2(转)
说明: 本文共两篇,转自GCC精彩之旅.第一篇着重介绍GCC编译一个程序的过程与优化,第二篇侧重在GCC结合GDB对代码的调试. 调试 一个功能强大的调试器不仅为程序员提供了跟踪程序执行的手段 ...
- Yii2中JSONP跨域问题的解决
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从不同的域(网站)访问数据需 ...
- 算法提高 金陵十三钗 状压DP
思路:深度搜索复杂度N!过不了.考虑动态规划:将已经选择的列记为1,未选择表示0,二进制压缩,例如110,就表示选择了第1列和第2列. d(i, t)表示当前已经匹配了i行,选择了t这些列.状态转移: ...