还能说什么呢,简直太妙了。

$$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)$。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=;
  5. const ll INF=9e18;
  6. #define lson o<<1,l,mid
  7. #define rson o<<1|1,mid+1,r
  8. #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
  9. #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
  10. #define MEM(x,v) memset(x,v,sizeof(x))
  11. inline int read(){
  12. int x=,f=;char ch=getchar();
  13. while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
  14. while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
  15. return f?-x:x;
  16. }
  17. int n,q,a[maxn],k[maxn];
  18. ll kpre[maxn],kprepre[maxn],b[maxn],sum[maxn*],L[maxn*],R[maxn*],cov[maxn*];
  19. char op[];
  20. inline int pushup(int o){
  21. sum[o]=sum[o<<]+sum[o<<|];
  22. L[o]=L[o<<];
  23. R[o]=R[o<<|];
  24. }
  25. inline void cover(int o,int l,int r,ll x){
  26. sum[o]=(r-l+)*x;
  27. L[o]=R[o]=cov[o]=x;
  28. }
  29. inline void pushdown(int o,int l,int r){
  30. if(cov[o]!=-INF){
  31. int mid=(l+r)>>;
  32. cover(lson,cov[o]);
  33. cover(rson,cov[o]);
  34. cov[o]=-INF;
  35. }
  36. }
  37. void build(int o,int l,int r){
  38. cov[o]=-INF;
  39. if(l==r) return void(sum[o]=L[o]=R[o]=b[l]);
  40. pushdown(o,l,r);
  41. int mid=(l+r)>>;
  42. build(lson);build(rson);
  43. pushup(o);
  44. }
  45. ll query(int o,int l,int r,int ql,int qr){
  46. if(l>=ql && r<=qr) return sum[o];
  47. pushdown(o,l,r);
  48. int mid=(l+r)>>;
  49. ll s=;
  50. if(mid>=ql) s+=query(lson,ql,qr);
  51. if(mid<qr) s+=query(rson,ql,qr);
  52. return s;
  53. }
  54. void update(int o,int l,int r,int p,ll v){
  55. if(r<p || L[o]>v) return;
  56. if(l>=p && R[o]<=v) return cover(o,l,r,v);
  57. pushdown(o,l,r);
  58. int mid=(l+r)>>;
  59. update(lson,p,v);update(rson,p,v);
  60. pushup(o);
  61. }
  62. int main(){
  63. n=read();
  64. FOR(i,,n) a[i]=read();
  65. FOR(i,,n-) k[i]=read();
  66. FOR(i,,n-) kpre[i]=kpre[i-]+k[i];
  67. FOR(i,,n-) kprepre[i]=kprepre[i-]+kpre[i];
  68. FOR(i,,n) b[i]=a[i]-kpre[i-];
  69. build(,,n);
  70. q=read();
  71. while(q--){
  72. scanf("%s",op+);
  73. int x=read(),y=read();
  74. if(op[]=='+') update(,,n,x,query(,,n,x,x)+y);
  75. else cout<<query(,,n,x,y)+kprepre[y-]-kprepre[max(,x-)]<<endl;
  76. }
  77. }

CF1136E Nastya Hasn't Written a Legend(线段树)的更多相关文章

  1. Codeforces 1136E Nastya Hasn't Written a Legend 线段树

    vp的时候没码出来.. 我们用set去维护, 每一块区域, 每块区域内的元素与下一个元素的差值刚好为ki,每次加值的时候我们暴力合并, 可以发现我们最多合并O(n)次. 然后写个线段树就没了. #in ...

  2. Codeforces 1136E - Nastya Hasn't Written a Legend - [线段树+二分]

    题目链接:https://codeforces.com/problemset/problem/1136/E 题意: 给出一个 $a[1 \sim n]$,以及一个 $k[1 \sim (n-1)]$, ...

  3. Codeforces 1136E Nastya Hasn't Written a Legend (线段树教做人系列)

    题意:有一个数组a和一个数组k,数组a一直保持一个性质:a[i + 1] >= a[i] + k[i].有两种操作:1,给某个元素加上x,但是加上之后要保持数组a的性质.比如a[i]加上x之后, ...

  4. cf1136E. Nastya Hasn't Written a Legend(二分 线段树)

    题意 题目链接 Sol yy出了一个暴躁线段树的做法. 因为题目保证了 \(a_i + k_i <= a_{i+1}\) 那么我们每次修改时只需要考虑取max就行了. 显然从一个位置开始能影响到 ...

  5. codeforces#1136E. Nastya Hasn't Written a Legend(二分+线段树)

    题目链接: http://codeforces.com/contest/1136/problem/E 题意: 初始有a数组和k数组 有两种操作,一,求l到r的区间和,二,$a_i\pm x$ 并且会有 ...

  6. Codeforces Round #546 (Div. 2) E - Nastya Hasn't Written a Legend

    这题是一个贼搞人的线段树 线段树维护的是 区间和a[i - j] 首先对于update的位置可以二分查找 其次update时候的lazy比较技巧 比如更新的是 l-r段,增加的是c 那么这段的值为: ...

  7. 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\),那 ...

  8. Codeforces Round #489 (Div. 2) E. Nastya and King-Shamans(线段树)

    题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) , 现在会进行 \(m\) 次操作 , 每次操作会修改某个 \(a_i\) 的值 , 在每次操作完后你需要判断是否存在一个位置 \(i ...

  9. Nastya and King-Shamans CodeForces - 992E (线段树二分)

    大意: 给定序列a, 单点更新, 询问是否存在a[i]等于s[i-1], s为a的前缀和, a非负 考虑到前缀和的单调性, 枚举从1开始前缀和, 找到第一个大于等于s[1]的a[i], 如果相等直接输 ...

随机推荐

  1. Debug 路漫漫-15:Python: NameError:name 'dataset' is not defined

    在调试 <Outer Product-based Neural Collaborative Filtering>论文的源码(https://github.com/duxy-me/ConvN ...

  2. 明解JAVA 第二章答案

    练习2-1 编译错误,无法运行. 练习2-2 package candle1220; class Nightwatch{ public static void main(String[] args) ...

  3. JavaScript的__proto__、prototype和继承

    JavaScript也是可以“继承”的! 各位看官或是好奇,或是一知半解.什么是prototype,__proto__,constructor.哪种继承方式好.今天就在这交流交流. 什么是protot ...

  4. 车位iou计算

    车位检测中,判断多帧图像检测出的车位是否是同一个车位.计算其IOU. 判断一个点是否在一个四边形内 Approach : Let the coordinates of four corners be ...

  5. RootKit随手记(一)RootKit的驱动隐藏、读取配置、卸载安装

    边学习边更新这专题,随手记录一下用到的思路,给自己看的(所以读者看可能有些懵,不好意思...) RootKit随手记(一)RootKit的驱动隐藏.读取配置.卸载安装 一.驱动隐藏 1. 隐藏原理 一 ...

  6. vue 上传进度显示

    参考资料: https://ask.csdn.net/questions/767017 https://www.cnblogs.com/best-fyx/p/11363506.html 我使用的是el ...

  7. SQL Server 跨服务器、跨版本使用复制 (2008、2012)

    在两台不同的服务器间实现SQL Server 的发布和订阅,需要一些设置. 测试环境:2008数据库.2012数据库,可实现跨版本发布订阅 本次测试是08的数据库做发布端 ,使用08数据及12数据库均 ...

  8. 百度站长平台HTTPS认证所遇到的坑

    坑1: 百度站长平台https认证失败,提示:请确保您网站的所有链接均支持https访问,且未使用不安全协议(如:SSL2.SSL3等协议). 解决办法: 1.  友情链接检查, 要检查所有的友情链接 ...

  9. jenkins安装后提示localhost 拒绝了我们的连接请求。

    我是用msi文件安装的windows本地 ,安装文件看另外安装的博文. 此问题解决不是第一次安装方案 ,而是第一次安装完,使用也正常,关电脑再次访问的时候提示找不到 ,是因为本地服务没有启动  ,wi ...

  10. Flask-Cookies和Session

    目录 cookies session save_session的参数 session源码执行流程 请求第一次过来时 请求第二次进来 SecureCookieSession 签名算法 session的生 ...