内存限制:256 MiB时间限制:1500 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: hzwer

题目描述

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

输入格式

第一行输入一个数字 nn。

第二行输入 nn 个数字,第 ii 个数字为 a_iai​,以空格隔开。

接下来输入 nn 行询问,每行输入四个数字 \mathrm{opt}opt、ll、rr、cc,以空格隔开。

若 \mathrm{opt} = 0opt=0,表示将位于 [l, r][l,r] 的之间的数字都加 cc。

若 \mathrm{opt} = 1opt=1,表示询问 [l, r][l,r] 中 cc 的前驱的值(不存在则输出 -1−1)。

输出格式

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

样例

样例输入

  1. 4
  2. 1 2 2 3
  3. 0 1 3 1
  4. 1 1 4 4
  5. 0 1 2 2
  6. 1 1 2 4

样例输出

  1. 3
  2. -1

数据范围与提示

对于 100\%100% 的数据,1 \leq n \leq 100000, -2^{31} \leq \mathrm{others}1≤n≤100000,−231≤others、\mathrm{ans} \leq 2^{31}-1ans≤231−1。

代码:

  1. //#6279. 数列分块入门 3-区间加法,查询区间内小于某个值x的前驱(比其小的最大元素)
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5. const int maxn=1e5+;
  6.  
  7. int n,m;
  8. ll a[maxn],b[maxn],pos[maxn],tag[maxn];
  9.  
  10. void rechange(int x)
  11. {
  12. for(int i=(x-)*m+;i<=min(x*m,n);i++){
  13. b[i]=a[i];
  14. }
  15. sort(b+(x-)*m+,b+min(x*m,n)+);
  16. }
  17.  
  18. void update(int l,int r,ll c)
  19. {
  20. if(pos[l]==pos[r]){
  21. for(int i=l;i<=r;i++)
  22. a[i]+=c;
  23. rechange(pos[l]);
  24. }
  25. else{
  26. for(int i=l;i<=pos[l]*m;i++)
  27. a[i]+=c;
  28. rechange(pos[l]);
  29. for(int i=pos[l]+;i<=pos[r]-;i++)
  30. tag[i]+=c;
  31. for(int i=(pos[r]-)*m+;i<=r;i++)
  32. a[i]+=c;
  33. rechange(pos[r]);
  34. }
  35. }
  36.  
  37. ll query(int l,int r,ll c)
  38. {
  39. ll ans=-;
  40. if(pos[l]==pos[r]){
  41. for(int i=l;i<=r;i++){
  42. if(a[i]+tag[pos[l]]<c){
  43. ans=max(ans,a[i]+tag[pos[l]]);
  44. }
  45. }
  46. }
  47. else{
  48. for(int i=l;i<=pos[l]*m;i++){
  49. if(a[i]+tag[pos[l]]<c){
  50. ans=max(ans,a[i]+tag[pos[l]]);
  51. }
  52. }
  53. for(int i=pos[l]+;i<=pos[r]-;i++){
  54. int cnt=c-tag[i];
  55. int ret=lower_bound(b+(i-)*m+,b+i*m+,cnt)-b-;
  56. //cout<<ret<<" "<<(i-1)*m<<endl;
  57. if(ret!=(i-)*m)
  58. ans=max(ans,b[ret]+tag[i]);
  59. }
  60. for(int i=(pos[r]-)*m+;i<=r;i++){
  61. if(a[i]+tag[pos[r]]<c){
  62. ans=max(ans,a[i]+tag[pos[r]]);
  63. }
  64. }
  65. }
  66. return ans;
  67. }
  68.  
  69. int main()
  70. {
  71. scanf("%d",&n);
  72. m=sqrt(n);
  73. for(int i=;i<=n;i++){
  74. scanf("%d",&a[i]);
  75. b[i]=a[i];
  76. pos[i]=(i-)/m+;
  77. }
  78. for(int i=;i<=m+;i++)
  79. sort(b+(i-)*m+,b+min(i*m,n)+);
  80. for(int i=;i<=n;i++){
  81. int op,l,r;
  82. ll c;
  83. scanf("%d%d%d%lld",&op,&l,&r,&c);
  84. if(op==){
  85. update(l,r,c);
  86. }
  87. else{
  88. printf("%lld\n",query(l,r,c));
  89. }
  90. }
  91. }
  92.  
  93. /*
  94. 10
  95. 1 3 4 2 5 7 11 3 5 1
  96. 0 1 5 1
  97. 1 1 7 2
  98. 0 3 9 1
  99. 1 4 8 7
  100. 1 1 10 6
  101. 1 3 5 3
  102. 1 5 10 7
  103. 1 6 10 6
  104. 1 2 7 4
  105. 1 2 7 5
  106.  
  107. -1
  108. 4
  109. 4
  110. -1
  111. 6
  112. 4
  113. -1
  114. 4
  115. */

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

  1. #6279. 数列分块入门 3(询问区间内小于某个值 xx 的前驱(比其小的最大元素))

    题目链接:https://loj.ac/problem/6279 题目大意:中文题目 具体思路:按照上一个题的模板改就行了,但是注意在整块查找的时候的下标问题. AC代码: #include<b ...

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

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

  3. LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)

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

  4. LOJ-6279-数列分块入门3(分块, 二分)

    链接: https://loj.ac/problem/6279 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的前驱(比其小的最大元素). 思路: 同样的分块加二 ...

  5. LOJ-6278-数列分块入门2(分块)

    链接: https://loj.ac/problem/6278 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的元素个数. 思路: 分块,用vector维护每个区 ...

  6. LOJ.6284.数列分块入门8(分块)

    题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...

  7. LOJ-6277-数列分块入门1(分块)

    链接: https://loj.ac/problem/6277 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,单点查值. 思路: 线段树可以解决,用来学习分块. 分块概念就是,将序列分 ...

  8. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing

    [题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...

  9. LOJ 6279 数列分块入门3

    嗯... 题目链接:https://loj.ac/problem/6279 这道题在分块的基础上用vc数组记录,然后最后分三块,两边暴力枚举找前驱,中间lower_bound找前驱. AC代码: #i ...

随机推荐

  1. java 面向对象编程(OOP)

    java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改: 代码复用: 增加代码的可靠性和灵活性: 增加代码的可理解性. 封装 封装 ...

  2. mysql 在查询结果中进行二次查询

    第一次查询:查询身份证编号和出现次数 select cardid,count(cardid) as total from p_person_info group by cardid 在第一次查询结果进 ...

  3. Zyan 一个通信框架

    原文地址 本文示例 Zyan是一个简单直观的分布式应用程序开发框架. 以下是Zyan项目的简要概述. 架构图: Zyan一般由客户端和服务端组成.服务端(以组件的形式)提供服务,客户端远程调用服务端的 ...

  4. 【BZOJ】3329: Xorequ

    [题意]给定方程x^3x=2x,求<=x和<=2^x的满足方程的正整数个数. [算法]数位DP,矩阵快速幂 [题解]异或相当于不进位加法. 移项得,x^2x=3x,又因为x+2x=3x,所 ...

  5. 【51NOD-5】1293 球与切换器

    [算法]DP [题解]f[i][j][0]表示在i,j位置往下走的球数,f[i][j][1]表示在i,j位置往右走的球数,经过i,j的球若为-1则(num+1)/2往下,其余往右.+1类似. 转移见代 ...

  6. java分页通用篇

    一.创建分页通用类 package com.dkyw.util; import java.util.List; public class Page<T> { private int tot ...

  7. 【Python学习笔记】有关包的基本知识

    python的包(package)是一个有层次的文件目录结构.它定义了一个由模块和子包组成的Python应用程序执行环境. AAA/ __init__.py bbb.py CCC/ __init__. ...

  8. linux编程之信号

    信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如: 键盘中断等等,在Linux 的shell 中,也可以使用信 ...

  9. 网络知识===wireshark抓包,三次握手分析

    TCP需要三次握手建立连接: 网上的三次握手讲解的太复杂抽象,尝试着使用wireshark抓包分析,得到如下数据: 整个过程分析如下: step1 client给server发送:[SYN] Seq ...

  10. ERROR 1682 (HY000)

    ERROR 1682 (HY000) xtrabackup 恢复数据库后,出现1682错: root@localhost [(none)]>show global variables like ...