数列分块入门 3

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1000010;
ll n,num,sq;
ll a[N],b[N],tag[N],q[N],lll[N],rrr[N];
void order(int x)
{for(int i=lll[q[x]];i<=rrr[q[x]];i++) b[i]=a[i];sort(b+lll[q[x]],b+rrr[q[x]]+1);
}
void build()
{sq=sqrt(n);num=(ll)ceil(n*1.0/sq);for(int i=1;i<=n;i++){q[i]=(i-1)/sq+1;b[i]=a[i];}for(int i=1;i<=num;i++){lll[i]=(i-1)*sq+1;rrr[i]=i*sq;}rrr[num]=n;for(int i=1;i<=num;i++) sort(b+lll[i],b+rrr[i]+1);
}
void change(int l,int r,int c)
{if(q[l]==q[r]){for(int i=l;i<=r;i++) a[i]+=c;order(l);return;}for(int i=l;i<=rrr[q[l]];i++) a[i]+=c;for(int i=lll[q[r]];i<=r;i++) a[i]+=c;order(l),order(r);for(int i=q[l]+1;i<q[r];i++) tag[i]+=c;
}
ll ask(int l,int r,ll c)
{ll ans=-1e10,flag=0;if(q[l]==q[r]){for(int i=l;i<=r;i++){if(a[i]+tag[q[i]]<c){ans=max(ans,a[i]+tag[q[i]]);flag=1;}}if(flag) return ans;else return -1;}for(int i=l;i<=rrr[q[l]];i++){if(a[i]+tag[q[i]]<c){ans=max(ans,a[i]+tag[q[i]]);flag=1;}}for(int i=lll[q[r]];i<=r;i++){if(a[i]+tag[q[i]]<c){ans=max(ans,a[i]+tag[q[i]]);flag=1;}}for(int i=q[l]+1;i<q[r];i++){ll pos=lower_bound(b+lll[i],b+rrr[i]+1,c-tag[i])-b-1;if(pos<lll[i]) continue;ans=max(ans,b[pos]+tag[i]);flag=1;}if(flag) return ans;else return -1;
}
int main()
{scanf("%lld",&n);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);build();for(int i=1;i<=n;i++){ll op,l,r,c;scanf("%lld%lld%lld%lld",&op,&l,&r,&c);if(op==0) change(l,r,c);else printf("%lld\n",ask(l,r,c));}return 0;
}
/*
4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
*/

双倍经验:洛谷 守墓人

#6279. 数列分块入门 3相关推荐

  1. #6279. 数列分块入门 3(区间修改,查询权值前驱)

    #6279. 数列分块入门 3 这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍. #include ...

  2. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给出一 ...

  3. LibreOj 6279数列分块入门 3 练习了一下set

    题目链接:https://loj.ac/problem/6279 推荐博客:https://blog.csdn.net/qq_36038511/article/details/79725027 这题区 ...

  4. LibreOJ 6279 数列分块入门 3(分块+排序)

    题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...

  5. 数列分块入门 (1 ~ 7)

    分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n​.对于区间加操作,我们可以 ...

  6. 「分块」数列分块入门1 – 9

    ACM模板 放暑假了,回归!!! 自己不会写暴力,而且好久没写代码了,于是学学分块的优雅暴力~ 「分块入门-LibreOJ」 「分块」数列分块入门1 – 9 by hzwer 数列简单分块问题实际上有 ...

  7. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  8. 【分块入门】LOJ 数列分块入门 1 - 9 (学习更新……)

    dl题解 _「分块」数列分块入门1 – 9 by hzwer LOJ #6277. 数列分块入门 1 题意:给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 时间限制:100ms 分块 ...

  9. LOJ 数列分块入门6

    LOJ 数列分块入门6 题目: 题目 题解: 我都不懂这题为什么要用分块... ... 直接vector就好了... 但是如果有区间修改的话就不行了.所以这题是启示我们也可以动态分块.具体就是每次插入 ...

最新文章

  1. Android性能优化典范第二季
  2. 计算机文化英文15版答案,15信高《计算机文化基础》期中考试题答案
  3. vue 双向数据绑定的实现学习(一)
  4. 在服务器上使用第三方独立组件对Word/Excel进行编程
  5. Mysql 中如何创建触发器
  6. 解决问题的经验-javaweb-第一次-已掌握技术栈大致总结(部分),和相关理解,总结,以及对未来学习方向的规划
  7. 使用带有OAuth2的Web应用程序和使用JWT来调用API – WSO2 API Manager
  8. 深入react技术栈(10):受控组件和非受控组件
  9. 教你用纯Java实现一个即时通讯系统(附源码)
  10. inception V4 与resnet
  11. Neural Architecture Search(NAS)强化学习寻找最优网络、NASNet、MNASNet
  12. 局域网内window10和Windows7共享只有USB接口打印机的方法——以sharp2048D为例子
  13. windows的hosts文件在哪?
  14. AcWing 143. 最大异或对 —— 神奇的二进制
  15. 根据浏览器的默认语言来切换中英文页面
  16. dms mysql定义变量_数据管理DMS:自建MySQL数据库 全量SQL诊断功能发布啦!-阿里云开发者社区...
  17. 2017华为算法大赛总结
  18. 关于敏捷开发的一篇访谈录
  19. 苹果移动设备密码破解
  20. MySQL函数:ON UPDATE CURRENT_TIMESTAMP 与 CURRENT_TIMESTAMP

热门文章

  1. python英文发音-用Python写一个背英文单词程序
  2. VBA小程序_对于选中的单元格进行取消合并_选择空值向上填充
  3. 直播继续搅局双11?
  4. C语言程序软件电脑版,C语言宝典PC版-C语言宝典电脑版下载 v1.7.3--PC6电脑版
  5. 供给云saas平台小程序赋能门店增加销售额
  6. LaTex公式长度过长
  7. 丁腈橡胶的广泛应用及其特点
  8. pandas中DataFrame的常用操作
  9. 1671. Anansi's Cobweb(并查集)
  10. E. Exits in Excess