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 老师交给小可可一个维护数列的任务,现在小可 ...
随机推荐
- Flask-Moment----探索
前言: Flask-Moment在所有的flask扩展中算是相对简单的一个了,但是还是有很多需要理解的地方.那么今天就跟着笔者一起,来学习一下flask-moment在flask项目中的应用. 首先 ...
- EFCore数据库迁移命令整理
前言 因为现在用.net core 开发新项目,过程中需要经常涉及到数据命令的迁移,今天分别整EFCore 的两种迁移数据库的方式 1 程序包管理器控制台 , Package Manager Con ...
- H5 拖拽,一个函数搞定,直接指定对象设置可拖拽
页面上,弹个小窗体,想让它可以拖拽,又不想 加载一堆js,就简单的能让他可以拖动? 嗯,下面有这样一个函数,调用下就好了! 1. 先来说说 H5的 拖拽 在 HTML5 中,拖放是标准的一部分,任何元 ...
- 获取登陆用户的ip
function getip(){ static $ip = null; if($ip !=null) return $ip; if(getenv('REMOTE_ADDR') ...
- 【剑指offer28:字符串的排列】【java】
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. import ja ...
- html2canvas在微信中无法使用
html2canvas: https://github.com/niklasvh/html2canvas 本来想在微信网页中使用html2canvas生成图片,结果死活不行 测试发现在Chrome,手 ...
- 使用tdload工具将本地数据导入到Teradata数据库中
想把本地的数据文件(比如txt.csv)中的数据导入到Teradata虚拟机中的表中.既可以使用Teradata Assistant中的import功能,也可以使用fastload导入,前者的缺点是一 ...
- Qt msvc Modules
3D ActiveQt container ActiveQt server Bluetooth Concurrent Core Enginio Declarative Gui Help Locatio ...
- 傅里叶变换 - Fourier Transform
傅里叶级数 傅里叶在他的专著<热的解析理论>中提出,任何一个周期函数都可以表示为若干个正弦函数的和,即: \[f(t)=a_0+\sum_{n=1}^{\infty}(a_ncos(n\o ...
- sqlserver中select造成死锁
死锁过程: select语句使用非聚族索引查询产量信息,会对非聚族索引添加共享锁,由于非聚族索引上没有select的全部数据列,(所以会有书签查找出现,)需要查询产量表.查询产量表时,需要对产量表数据 ...