bzoj 1798 线段树
1798: [Ahoi2009]Seq 维护序列seq
Time Limit: 30 Sec Memory Limit: 64 MB
Submit: 7163 Solved: 2587
[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
//加两个tag标记下传,注意乘的优先级高于加法所以加之前要乘完。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int MAXN=;
int n;
ll p,add[MAXN*],mul[MAXN*],sum[MAXN*];
void pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
if(sum[rt]>p) sum[rt]%=p;
}
void pushdown(int rt,int len)
{
if(mul[rt]==&&add[rt]==) return;
mul[rt<<]=(mul[rt<<]*mul[rt])%p;
add[rt<<]=(add[rt<<]*mul[rt]+add[rt])%p;
sum[rt<<]=(sum[rt<<]*mul[rt]+add[rt]*(len-(len>>)))%p;
mul[rt<<|]=(mul[rt<<|]*mul[rt])%p;
add[rt<<|]=(add[rt<<|]*mul[rt]+add[rt])%p;
sum[rt<<|]=(sum[rt<<|]*mul[rt]+add[rt]*(len>>))%p;
mul[rt]=;
add[rt]=;
}
void build(int rt,int l,int r)
{
add[rt]=;
mul[rt]=;
if(l==r){
scanf("%lld",&sum[rt]);
return;
}
int mid=(l+r)>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
pushup(rt);
}
void update(int rt,int l,int r,int ql,int qr,ll c,int ff)
{
if(ql<=l&&qr>=r){
if(ff==){
mul[rt]=(mul[rt]*c)%p;
sum[rt]=(sum[rt]*c)%p;
add[rt]=(add[rt]*c)%p;
}else{
add[rt]+=c;
sum[rt]=(sum[rt]+c*(r-l+))%p;
}
return;
}
pushdown(rt,r-l+);
int mid=(l+r)>>;
if(ql<=mid) update(rt<<,l,mid,ql,qr,c,ff);
if(qr>mid) update(rt<<|,mid+,r,ql,qr,c,ff);
pushup(rt);
}
ll query(int rt,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r) return sum[rt];
pushdown(rt,r-l+);
int mid=(l+r)>>;
ll ans=;
if(ql<=mid) ans+=query(rt<<,l,mid,ql,qr);
if(qr>mid) ans+=query(rt<<|,mid+,r,ql,qr);
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%lld",&n,&p);
build(,,n);
int m,op,x,y;
ll z;
scanf("%d",&m);
while(m--){
scanf("%d",&op);
if(op==){
scanf("%d%d%lld",&x,&y,&z);
update(,,n,x,y,z,);
}else if(op==){
scanf("%d%d%lld",&x,&y,&z);
update(,,n,x,y,z,);
}else{
scanf("%d%d",&x,&y);
ll ans=query(,,n,x,y);
printf("%lld\n",ans%p);
}
}
return ;
}
bzoj 1798 线段树的更多相关文章
- BZOJ 1798 (线段树||分块)的标记合并
我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...
- bzoj 3999 线段树区间提取 有序链剖
看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...
- bzoj 3211 线段树
开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...
- bzoj 1018 线段树维护连通性
本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...
- bzoj 3212 线段树
裸的线段树 /************************************************************** Problem: User: BLADEVIL Langua ...
- bzoj 2120 线段树套平衡树
先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...
- bzoj 1901 线段树套平衡树+二分答案查询
我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...
- BZOJ 1012 线段树||单调队列
非常裸的线段树 || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...
- BZOJ 3681 线段树合并+网络流
思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...
随机推荐
- (转)Django配置数据库读写分离
转:https://blog.csdn.net/Ayhan_huang/article/details/78784486 转:http://www.cnblogs.com/dreamer-fish/p ...
- PHP--面向对象的设计原则
三大特性是:封装.继承.多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 封装是面向对象的特征之一,是对象和类概念的主要特 ...
- Scrum Meeting 10.31
成员 今日任务 明日任务 今日工作时长 徐越 整理开发文档,学习ip相关知识,学习servlet相关知识 代码迁移,学习数据库相关知识 5h 赵庶宏 学习学长的servlet代码 进行数据库的连接 4 ...
- 对网络助手的NABCD分析心得
Sunny--Code团队::刘中睿,杜晓松,郑成 我们小组这次做的软件名字叫为校园网络助手.在大学学习的同学都知道学校里面有着内网与外网两种,并且有着流量限制,所以我们设计出来了这项软件,它主要有着 ...
- Structs2笔记③--局部类型转换案例
Structs2的类型转换-局部类型转换 Ognl强大的表达式语言,在导入项目的时候我们导入了ognl.jar包,内有TypeConverter类,struct主要依赖于他进行类型转换. 例子 i ...
- Struct2笔记②--完善登陆代码
上节课的代码 写完整 登陆成功在页面上显示用户名和密码: username:${requestScope.username }<br> password:${requestScope. ...
- 新的Calculator的规范作业
附加作业题目 第三次作业 mygithub:sonnypp 这是开学来第一次写随笔,这一次的作业是对上一次作业的修改,对于上一次作业,在学长老师的帮助下,我重新修改了下代码,将.h文件分成了一个Sca ...
- Teamwork(The eighth day of the team)
在经过算是蛮艰辛的努力后吧,我们终于有了一点点成果.虽然还离理想中的蛮遥远的,但是我们相信,虽然我们走得很慢,但是我们一直都会坚持前进.
- 2016011998+sw
Coding.net原码仓库地址:https://git.coding.net/laolaf/sw.git 目录 1 需求分析 2 功能设计 3 设计实现 4 算法详解 5 测试运行 6 满意代码 1 ...
- 第二章 Socket用法详解
构造Socket Socket构造方法如下: Socket() //Creates an unconnected socket, with the system-default type of Soc ...