bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq
Time Limit: 30 Sec Memory Limit: 64 MB
Submit: 7773 Solved: 2792
[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
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
Source
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- const int M = 2e5+;
- ll sum[M<<],add[M<<],mul[M<<],md;
- void pushup(int rt){
- sum[rt] = (sum[rt<<] + sum[rt<<|])%md;
- }
- void pushdown(int m,int rt){
- add[rt<<] = (add[rt<<]*mul[rt] + add[rt])%md;
- add[rt<<|] = (add[rt<<|]*mul[rt]+add[rt])%md;
- mul[rt<<] = mul[rt<<]*mul[rt]%md;
- mul[rt<<|] = mul[rt<<|]*mul[rt]%md;
- sum[rt<<] = (sum[rt<<]*mul[rt] + add[rt]*(m-(m>>)))%md;
- sum[rt<<|] = (sum[rt<<|]*mul[rt]+add[rt]*(m>>))%md;
- add[rt] = ; mul[rt] = ;
- }
- void build(int l,int r,int rt){
- add[rt] = ;mul[rt] = ;
- if(l==r){
- scanf("%lld",&sum[rt]);
- return;
- }
- int m = (l + r) >> ;
- build(lson);
- build(rson);
- pushup(rt);
- }
- void update(int L,int R,int c,int v,int l,int r,int rt){
- if(L <= l&&R >= r){
- if(v==){
- sum[rt] = sum[rt]*c%md;
- add[rt] = add[rt]*c%md;
- mul[rt] = mul[rt]*c%md;
- }
- else{
- sum[rt] = (sum[rt] + (ll)c*(r-l+))%md;
- add[rt] = (add[rt]+c)%md;
- }
- return;
- }
- pushdown(r-l+,rt);
- int m = (l + r) >> ;
- if(L <= m) update(L,R,c,v,lson);
- if(R > m) update(L,R,c,v,rson);
- pushup(rt);
- }
- ll query(int L,int R,int l,int r,int rt){
- if(L <= l&&R >= r){
- return sum[rt]%md;
- }
- pushdown(r-l+,rt);
- ll ret = ;
- int m = (l + r) >> ;
- if(L <= m) ret = (ret+query(L,R,lson))%md;
- if(R > m) ret = (ret+query(L,R,rson))%md;
- return ret;
- }
- int main()
- {
- int n,q,a,c,b,d;
- scanf("%d %lld",&n,&md);
- build(,n,);
- scanf("%d",&q);
- while(q--){
- scanf("%d",&a);
- if(a==){
- scanf("%d %d %d",&b,&c,&d);
- update(b,c,d,,,n,);
- }
- else if(a==){
- scanf("%d %d %d",&b,&c,&d);
- update(b,c,d,,,n,);
- }
- else{
- scanf("%d%d",&b,&c);
- printf("%lld\n",query(b,c,,n,));
- }
- }
- }
bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)的更多相关文章
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 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 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- 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 .有如下三种操作形式: ( ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)
[题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...
随机推荐
- jqgrid 设置多表头
有时,我们需要给jqgrid设置多表头信息,多表头区域会有行合并/列合并,如何实现? 1)通过jqgrid的 setGroupHeaders 方法来实现一个行的多表头, 2)如果有多行表头,需要设置多 ...
- jqgrid 将列头设置为超链接或按钮
有时,需要将某个列头设置为超链接或按钮,点击超链接或按钮能够跳转至其他页面(或执行一个事件操作). 可以把 label 值设置成一个a标签或button 代码如下: colModel: [{ labe ...
- easyui的datagrid
datagrid数据的绑定方式: 1)data 后跟数据行的json串 2)url 后跟{"total":,"rows":,"foot":} ...
- Flask安装教程
第1步:确保本机已经安装有python,下载easy_install到本地某一目录,双击ez_setup.py,python将自动下载到python安装目录/Scripts 下面,然后在系统环境变量的 ...
- Swift - 给图片和按钮添加阴影边框
最近比较忙,想要做的事情有很多,能做出来的就只有一部份,我觉得也许是我没有计划和规律造成的,我需要坚持下去,今天写了一个swift2.0给按钮或者图片添加阴影的效果,就当做笔记吧:-) Swift C ...
- Mike的农场 BZOJ4177
分析: 最小割,不选则割的建模题...(然而一开始我当成了费用流,简直丧心病狂...最后想到了最小割...) 对于条件一,直接建一条双向边就可以了,并且不计入sum中,因为这是作为费用的存在,让它跑出 ...
- 20155226《网络攻防》 Exp3 免杀原理与实践
20155226<网络攻防> Exp3 免杀原理与实践 实验过程 1. msfvenom直接生成meterpreter可执行文件 直接将上周做实验时用msf生成的后门文件放在virscan ...
- 20155304《网络对抗》MSF基础应用
20155304<网络对抗>MSF基础应用 实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_ ...
- 汇编 循环位移指令 ROL, 循环位移指令 ROR
知识点: 循环位移指令 ROL 循环位移指令 ROR 一.循环位移指令 ROL ROR int i=0x77886611;//01110111100010000110011000010001 ...
- 微信小程序 Echarts 异步数据更新
微信小程序 Echarts 异步数据更新的练习,被坑了很多次,特作记录. 作者:罗兵 地址:https://www.cnblogs.com/hhh5460/p/9989805.html 0.效果图 ...