【题目描述】

给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,询问区间内小于某个值 x 的前驱(比其小的最大元素)。

【输入格式】

第一行输入一个数字 n。

第二行输入 n 个数字,第 i 个数字为 ai,以空格隔开。

接下来输入 n 行询问,每行输入四个数字 opt、l、r、c,以空格隔开。

若 opt=0,表示将位于 [l,r] 的之间的数字都加 c。

若 opt=1,表示询问位于 [l,r] 中 c 的前驱的值,不存在输出 -1。

【输出格式】

对于每次询问,输出一行一个数字表示答案。

【样例】

样例输入
4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4

样例输出
3
-1

【数据范围与提示】

对于 100% 的数据,1<=n<=100000,-2^31<=other,ans<=2^31-1。

【源代码】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 100000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;int n;
int block,sum;//block为块的长度,sum为块的个数
int a[N];//存放数列元素
int pos[N],tag[N];//pos记录第i个元素在第几个块中,tag为操作标记
int ans[N];//维护整块和
vector<int> v[N];
void init(){block=sqrt(n);//块的长度sum=n/block;//块个数if(n%block)sum++;for(int i=1;i<=n;i++){pos[i]=(i-1)/block+1;//第i个元素在第几块中v[pos[i]].push_back(a[i]);//保存每个数分块的序号}for(int i=1;i<=sum;i++)//对整块进行排序sort(v[i].begin(),v[i].end());
}
void resort(int x){v[pos[x]].clear();for(int i=(pos[x]-1)*block+1;i<=min(pos[x]*block,n);i++)v[pos[x]].push_back(a[i]);sort(v[pos[x]].begin(),v[pos[x]].end());
}
void update(int L,int R,int x){for(int i=L;i<=min(pos[L]*block,R);i++)//左边的边角料a[i]+=x;resort(L);//对不完整块排序if(pos[L]!=pos[R]){//存在右区间才遍历,防止重复计算for(int i=(pos[R]-1)*block+1;i<=R;i++)//右边的边角料a[i]+=x;resort(R);//对不完整块排序}for(int i=pos[L]+1;i<=pos[R]-1;i++)//中间的整块tag[i]+=x;
}
void query(int L,int R,int x){int res=-INF;bool flag=false;for(int i=L;i<=min(pos[L]*block,R);i++){//左边的边角料if(a[i]+tag[pos[L]]<x){res=max(a[i]+tag[pos[L]],res);flag=true;}}if(pos[L]!=pos[R]){//存在右区间才遍历,防止重复计算for(int i=(pos[R]-1)*block+1;i<=R;i++){//右边的边角料if(a[i]+tag[pos[R]]<x){res=max(a[i]+tag[pos[R]],res);flag=true;}}}for(int i=pos[L]+1;i<=pos[R]-1;i++){//中间的整块进行二分查找int temp=x-tag[i];int k=lower_bound(v[i].begin(),v[i].end(),temp)-v[i].begin();if(k!=0&&v[i][k-1]+tag[i]<x){res=max(res,v[i][k-1]+tag[i]);flag=true;}}if(!flag)printf("-1\n");elseprintf("%d\n",res);
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);init();for(int i=1;i<=n;i++){int op;int left,right,x;scanf("%d",&op);scanf("%d%d%d",&left,&right,&x);if(op==0)update(left,right,x);else if(op==1)query(left,right,x);}return 0;
}

数列分块入门 3(LibreOj-6279)相关推荐

  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. #6279. 数列分块入门 3

    数列分块入门 3 #include<bits/stdc++.h> using namespace std; #define ll long long const int N=1000010 ...

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

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

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

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

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

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

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

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

  8. LOJ 数列分块入门6

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

  9. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

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

  10. 数列分块入门(套题)(loj6277,loj6278,loj6279,loj6280,loj6281,loj6282,loj6283,loj6284,loj6285)

    前言 zjoi考差了,码一些分块题缓解一下心情 壹 数列分块入门 1[loj6277] 题目大意:区间加,单点查 直接分块,区间加时完全覆盖的块打tag,边界块暴力重构 块大小设为n\sqrt nn​ ...

最新文章

  1. Oracle exp/imp,备份或导入时注意的事项
  2. 神经网络防止过拟合的方法
  3. Sculpture ACM/ICPC NWERC 2008 离散化
  4. 【学习笔记】17、函数(Function)的定义和调用
  5. python long函数_python 内置函数
  6. QQ相册后台存储架构重构与跨IDC容灾实践
  7. Android之编译jni出错解决办法
  8. jsp mysql 音乐网站_Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统
  9. windows下批量换程序——运维常用
  10. 深入理解Java虚拟机:虚拟机类加载机制
  11. WSS3.0自带的问题跟踪工作流(Issue Tracking)的说明
  12. 从键盘输入n个整数,求它们的最小公倍数
  13. 完全背包问题 c语言
  14. PowerDesigner生成sql建表语句
  15. Failure obtaining db row lock: No row exists in table QRTZ_LOCKS for lock named
  16. Oracle (07)游标对象.智能循环(FOR) 遍历游标.NULL值的比较.异常处理.存储过程.如何指定参数的模式.function 函数.包 package.触发器 trigger
  17. 在word中公式太长,用公式编辑器怎样设置才能自动换行?
  18. Java+spring+springmvc 基于ssm的超市进销存管理系统#毕业设计
  19. 命令与征服2完全版+烈火风暴资料片
  20. 麦克风阵列声源定位实现

热门文章

  1. 数据大牛都在啃的10本书
  2. 那天,他无意间瞟了眼程序员的桌面……
  3. 大数据如何促进经济增长?中国优势及应对 | 互联网经济学
  4. CANOpen报文类型
  5. LinkedList作者说他自己都不用LinkedList?看完给我整不会了。。
  6. 漫话:为什么键盘以QWER排列,而不是ABCD?
  7. 代码重构技巧宝典,学透本篇就足够了!
  8. Jartto: 如何成为一名合格的技术面试官?
  9. Win7 64位下配置jboss7
  10. Linux IPC实践(4) --System V消息队列(1)