CF1136E Nastya Hasn't Written a Legend(线段树)
还能说什么呢,简直太妙了。
$$a_{i+1}<a_i+k_i$$
$$a_{i+1}-k_i-k_{i-1}-\cdots-k_1<a_i+k_i-k_i-k_{i-1}-\cdots-k_1$$
$$a_{i+1}-k_i-k_{i-1}-\cdots-k_1<a_i-k_{i-1}-\cdots-k_1$$
令 $k$ 的前缀和为 $kpre$。
$$a_{i+1}-kpre_i<a_i-kpre_{i-1}$$
令 $b_i=a_i-kpre_{i-1}$。
$$b_{i+1}<b_i$$
也就是 $b$ 应该是单调不降的。
询问,经典操作。注意要加回一些 $kpre$。具体要再开一个 $kpre$ 的前缀和 $kprepre$。
修改,可以线段树上二分,找到最后一个 $\le val$ 的值,区间覆盖即可。
时间复杂度 $O(n+q\log n)$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
const ll INF=9e18;
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,q,a[maxn],k[maxn];
ll kpre[maxn],kprepre[maxn],b[maxn],sum[maxn*],L[maxn*],R[maxn*],cov[maxn*];
char op[];
inline int pushup(int o){
sum[o]=sum[o<<]+sum[o<<|];
L[o]=L[o<<];
R[o]=R[o<<|];
}
inline void cover(int o,int l,int r,ll x){
sum[o]=(r-l+)*x;
L[o]=R[o]=cov[o]=x;
}
inline void pushdown(int o,int l,int r){
if(cov[o]!=-INF){
int mid=(l+r)>>;
cover(lson,cov[o]);
cover(rson,cov[o]);
cov[o]=-INF;
}
}
void build(int o,int l,int r){
cov[o]=-INF;
if(l==r) return void(sum[o]=L[o]=R[o]=b[l]);
pushdown(o,l,r);
int mid=(l+r)>>;
build(lson);build(rson);
pushup(o);
}
ll query(int o,int l,int r,int ql,int qr){
if(l>=ql && r<=qr) return sum[o];
pushdown(o,l,r);
int mid=(l+r)>>;
ll s=;
if(mid>=ql) s+=query(lson,ql,qr);
if(mid<qr) s+=query(rson,ql,qr);
return s;
}
void update(int o,int l,int r,int p,ll v){
if(r<p || L[o]>v) return;
if(l>=p && R[o]<=v) return cover(o,l,r,v);
pushdown(o,l,r);
int mid=(l+r)>>;
update(lson,p,v);update(rson,p,v);
pushup(o);
}
int main(){
n=read();
FOR(i,,n) a[i]=read();
FOR(i,,n-) k[i]=read();
FOR(i,,n-) kpre[i]=kpre[i-]+k[i];
FOR(i,,n-) kprepre[i]=kprepre[i-]+kpre[i];
FOR(i,,n) b[i]=a[i]-kpre[i-];
build(,,n);
q=read();
while(q--){
scanf("%s",op+);
int x=read(),y=read();
if(op[]=='+') update(,,n,x,query(,,n,x,x)+y);
else cout<<query(,,n,x,y)+kprepre[y-]-kprepre[max(,x-)]<<endl;
}
}
CF1136E Nastya Hasn't Written a Legend(线段树)的更多相关文章
- Codeforces 1136E Nastya Hasn't Written a Legend 线段树
vp的时候没码出来.. 我们用set去维护, 每一块区域, 每块区域内的元素与下一个元素的差值刚好为ki,每次加值的时候我们暴力合并, 可以发现我们最多合并O(n)次. 然后写个线段树就没了. #in ...
- Codeforces 1136E - Nastya Hasn't Written a Legend - [线段树+二分]
题目链接:https://codeforces.com/problemset/problem/1136/E 题意: 给出一个 $a[1 \sim n]$,以及一个 $k[1 \sim (n-1)]$, ...
- Codeforces 1136E Nastya Hasn't Written a Legend (线段树教做人系列)
题意:有一个数组a和一个数组k,数组a一直保持一个性质:a[i + 1] >= a[i] + k[i].有两种操作:1,给某个元素加上x,但是加上之后要保持数组a的性质.比如a[i]加上x之后, ...
- cf1136E. Nastya Hasn't Written a Legend(二分 线段树)
题意 题目链接 Sol yy出了一个暴躁线段树的做法. 因为题目保证了 \(a_i + k_i <= a_{i+1}\) 那么我们每次修改时只需要考虑取max就行了. 显然从一个位置开始能影响到 ...
- codeforces#1136E. Nastya Hasn't Written a Legend(二分+线段树)
题目链接: http://codeforces.com/contest/1136/problem/E 题意: 初始有a数组和k数组 有两种操作,一,求l到r的区间和,二,$a_i\pm x$ 并且会有 ...
- Codeforces Round #546 (Div. 2) E - Nastya Hasn't Written a Legend
这题是一个贼搞人的线段树 线段树维护的是 区间和a[i - j] 首先对于update的位置可以二分查找 其次update时候的lazy比较技巧 比如更新的是 l-r段,增加的是c 那么这段的值为: ...
- Nastya Hasn't Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)
题目链接 传送门 题面 题意 给你一个\(a\)数组和一个\(k\)数组,进行\(q\)次操作,操作分为两种: 将\(a_i\)增加\(x\),此时如果\(a_{i+1}<a_i+k_i\),那 ...
- Codeforces Round #489 (Div. 2) E. Nastya and King-Shamans(线段树)
题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) , 现在会进行 \(m\) 次操作 , 每次操作会修改某个 \(a_i\) 的值 , 在每次操作完后你需要判断是否存在一个位置 \(i ...
- Nastya and King-Shamans CodeForces - 992E (线段树二分)
大意: 给定序列a, 单点更新, 询问是否存在a[i]等于s[i-1], s为a的前缀和, a非负 考虑到前缀和的单调性, 枚举从1开始前缀和, 找到第一个大于等于s[1]的a[i], 如果相等直接输 ...
随机推荐
- php中in_array函数的坑
由于PHP是弱类型语言,所以有自动类型转换 例子 $array = [0, 1, 2, '3']; var_dump(in_array('abc', $array)); //true var_dump ...
- SAS——proc format的其他应用:invalue,picture,default,mult,prefix,noedit,_same_,_error_,other
一. proc format; invalue $test (default=200) "1"=_same_ "2"="Black" &qu ...
- CAS单点登录之支持数据库认证
本博客介绍一下基于CAS4.2.7的配置,之前博客CAS4.2.7服务端配置已经介绍了怎么部署CAS服务端,不过在登录机制是用固定的账号密码登录,实际项目肯定不可以这样做,所以本博客怎么配置CAS服务 ...
- 使用jstack排查多线程死锁、阻塞
问题: 针对线上多线程死锁.阻塞,跑着跑着就卡住了 查看线上线程池的状态 jstack用于生成java虚拟机当前时刻的线程快照. 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...
- mysql启动报错:Failed to start LSB: start and stop MySQL
报错信息: [root@youxx- bin]# service mysql status Redirecting to /bin/systemctl status mysql.service ¡ñ ...
- 使用EF批量新增数据十分缓慢
使用EF来批量新增数据,发现效率非常的差,几千条数据时甚至需要几分钟来执行,迫于无奈使用sql来执行了. 今天偶然看到一篇关于EF的文章,才发觉原来是自己对EF不够了解的原因. 一般新增时我们是将所有 ...
- 遍历倒排索引核心类:SegmentTermDocs/SegmentTermPositions
查询有哪些文档包含某个词元是Lucene搜索非常基础的一个功能,上层的搜索功能和索引功能都要基于这个功能来搭建.SegmentTermDocs就是查询词元所属文档的核心类,SegmentTermPos ...
- webpack4 plugins 篇
demo 代码点此,篇幅有限,仅介绍几个常用的. start 什么是 plugins ? While loaders are used to transform certain types of mo ...
- 什么是唯品会JIT业务
以销定采的模式,供应商将商品发给唯品会仓库在由唯品会发给客户:首先在唯品会创建档期绑定PO此时设置的商品库存为虚拟库存,之后供应商根据实际产生的有效订单将订单中的商品发给唯品会,最后再由唯品会发给用户 ...
- 白话SCRUM 之三:sprint backlog
Sprint Backlog就是任务列表,如果映射到传统的项目管理理论中就是WBS(work breakdown structure),而且是典型的采用面向交付物的任务分解方法得到的WBS. 比如有一 ...