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 ...
随机推荐
- Kubernetes探索学习005--Kubernetes的Controller模型和ReplicaSet伸缩
1.Kubernetes的controller pattern 需要认识到Kubernetes操作Pod的逻辑,都是由控制器来完成的. 查看之前写过的nginx-deployment的YAML文件 [ ...
- react-native 常规操作
1. 关闭xcode打开模拟器的快捷键 , 等常规操作 https://www.jianshu.com/p/f6723f3406b7
- nginx模块学习
rewrite模块的语法 链接
- Task 6.2冲刺会议六 /2015-5-19
今天主要写的是登陆界面,用户状态,历史登录信息,默认用户等等.由于大部分时间都是把代码组合拳起来的过程,所以总会出现各种bug,有好大一部分不会修复.明天要继续这一部分还有熟悉一下聊天的主界面.
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (二) 发送自定义数据
在我的项目里,树莓派主要作为中心节点,用于接收数据,Arduino作为子节点,用于发送数据,考虑到以后会有很多子节点,但又不至于使得代码过于繁琐,因此所有的传输数据添加一个头部编号用于区分不同节点. ...
- vue 过渡效果
Vue中提供了`<transition>`和`<transition-group>`来为元素增加过渡动画.文档写的很清楚,但是实际使用起来还是费了一番功夫.这里做一个简单的记录 ...
- [转帖]DAS、SAN、NAS
http://blog.itpub.net/26736162/viewspace-2214368/ DAS(Direct-attached Storage) 直连存储 直连式存储与服务器主机之间的连接 ...
- list 交换位置扩展
public static List<T> Swap<T>(this List<T> list, int index1,int index2) { if(index ...
- linux 关机、重启
一.重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 20 ...
- 多进程编程之用户ID和用户组ID
实际用户ID(real user id):用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的uid:(实际用户组ID类似) 有效用户ID(effect ...