Description

现在你有 NN 个数,分别为 A1,A2,…,ANA1,A2,…,AN ,现在有M组询问需要你回答。每个询问将会给你一个L和R(L<=R)(L,保证 MaxAi−MinAi<=R−LMax{Ai}-Min{Ai} ,你需要找出并输出最小的K(1<=K<=N1,不存在输出-1)满足以下两个条件:
①能够在原来的N个数中选出不重复(下标不重复)的K个数,使得这K个数的和在区间 [L,R][L,R] 内。
②能够在原来的N个数中选出不重复(下标不重复)的K个数,使得这K个数的和不在区间 [L,R][L,R] 内。

Input

输入第一行两个正整数 N,MN,M。
第二行N个数,表示A1,A2,…,ANA1,A2,…,AN
接下来M行表示M组询问,每组询问两个正整数L,R,意义如上。

Output

输出共M行,每一行输出对应询问的最小的K(不存在输出-1)。

Sample Input

5 3
3 6 5 8 7
29 34
2 8
1 10

Sample Output

-1
2
2

Data Constraint

Solution

  • 首先,能满足条件②的,显然满足组合的最大值> R 或者 最小值< L 即可

  • 那么先将A数组从小到大排一次序,前 k 个即为最小值,后 k 个即为最大值

  • 设前缀 pre[k]pre[k] 表示 排序后A数组中前 k 个数的和

  • 设后缀 suf[k]suf[k] 表示 排序后A数组中后 k 个数的和

  • 那么这两个数组可以 O(N)O(N) 预处理出,即可简单判断条件②。

  • 现在问题是如何解决条件①?

  • 观察题目中有这样一句话: MaxAi−MinAi<=R−LMax{Ai}-Min{Ai}

  • 这说明任意的两个 A[i]A[i] 相差不会超过 R−LR-L

  • 也就是说,排序后相邻的两种组合的差一定不会同时跨过 L,RL,R

  • 所以,只要 [pre[k],suf[k]][pre[k],suf[k]] 这个区间与 [L,R][L,R] 有交集,那么就一定满足条件①

  • 所以 pre[k]<L≤suf[k]pre[k] 或 pre[k]≤R<suf[k]pre[k]\leq R 即可

  • 那么这四个不等式,就分别对应着 k 的四个边界 l1,r1,l2,r2l1,r1,l2,r2

  • 且 l1<r1<l2<r2l1

  • 可以愉快地发现他们可以二分出来——O(logN)O(log N)

  • 因为 [l1,r1][l1,r1] 和 [l2,r2][l2,r2] 是合法的

  • 那么如果 [l1,r1][l1,r1] 合法就选 l1l1,否则如果 [l2,r2][l2,r2] 合法就选 l2l2。

  • 要是都不合法,就只能输出 −1-1 了。

  • 这样总的时间复杂度就是 O(MlogN)O(M log N),完美解决!

Code

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100001;
int n,m;
int a[N];
long long pre[N],suf[N];
long long l,r;
inline int solve()
{int l1=lower_bound(suf,suf+1+n,l)-suf;int r1=lower_bound(pre,pre+1+n,l)-pre-1;int l2=upper_bound(suf,suf+1+n,r)-suf;int r2=upper_bound(pre,pre+1+n,r)-pre-1;if(l1>n || !r2) return -1;if(l1>r1 && l2>r2) return -1;if(l1<=r1) return l1; else return l2;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+1+n);for(int i=1;i<=n;i++){pre[i]=pre[i-1]+a[i];suf[i]=suf[i-1]+a[n-i+1];}while(m--){scanf("%lld%lld",&l,&r);printf("%d\n",solve());}return 0;
}

JZOJ 4932. 【NOIP2017提高组模拟12.24】B相关推荐

  1. JZOJ 4933. 【NOIP2017提高组模拟12.24】C

    Description Input Sample Input 10 9 3580 8597 508 9110 9162 9973 6017 1942 989 646 1 3 4 405 4 3 5 5 ...

  2. JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇

    Description 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 (a,b)(a,b),若满足 a+b<=na+b 且 a+ba+b 是 abab 的因子,则成为神奇的数对. ...

  3. 【NOIP2017提高组模拟12.10】神炎皇

    题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...

  4. 【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇

    题目描述 降雷皇哈蒙很喜欢雷电,他想找到神奇的电光. 哈蒙有n条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的. 哈蒙想 ...

  5. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  6. JZOJ 5182. 【NOIP2017提高组模拟6.29】码灵鼠

    Description 码零鼠是一只很喜欢mx数学的神犇,上面那个不是ta本人的样子.这天,ta在研究一个神奇的数列,这个数列是这样的: a0 = 1 an = ai + aj (n>=1, i ...

  7. JZOJ 5186. 【NOIP2017提高组模拟6.30】tty's home

    Description Input Output Sample Input input 1: 5 1 1 1 1 1 1 2 2 3 3 4 4 5 input 2: 5 0 1 0 1 0 1 2 ...

  8. JZOJ 5197. 【NOIP2017提高组模拟7.3】C

    Description Input Output Sample Input 3 Sample Output 1 Data Constraint Solution 这题我的方法是打表找规律,可以发现答案 ...

  9. JZOJ 5195. 【NOIP2017提高组模拟7.3】A

    Description Input Output Sample Input 7 3 Sample Output 4 Data Constraint Solution 这是一道经典的DP问题了,也可以把 ...

最新文章

  1. Android组件化打造知乎日报系列(一)—— 项目架构搭建
  2. 在Docker中运行Dubbo应用
  3. boost asio 简单示例
  4. 20155203 - 杜可欣 - 预备作业2
  5. 在服务器搭建深度学习环境随笔
  6. 学习vue.js的自我梳理笔记
  7. linux安装ftp后账号密码设置,CentOS 建立ftp账号(vsftpd运用安装与配置疑问 )
  8. Java 最常见的 200+ 面试题全解析
  9. win11更新黑屏无法进入系统怎么办 windows11黑屏更新无法进入系统的解决方法
  10. 拓端tecdat:R语言主成分回归(PCR)、 多元线性回归特征降维分析光谱数据和汽车油耗、性能数据
  11. html设置flash的背景颜色,flash 如何设置舞台大小和背景颜色?
  12. 如何修复硬盘的分区表
  13. 2019-06-12-pintos 实验1
  14. 直观对比django与DRF
  15. 66.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。
  16. HTML<a>,<img>标签介绍及用法
  17. android自定义控件padding属性无效的解决
  18. 蓝桥杯训练题1427: [蓝桥杯][2013年第四届真题]买不到的数目【筛选符合题目的数字。有点类似筛素数】
  19. 华为ensp模拟器占用CPU高问题处理
  20. 【数据安全】数据脱敏解决方案

热门文章

  1. 吴恩达 coursera ML 第十二课总结+作业答案
  2. Matlab中特征选择reliefF算法使用方法(分类与回归)
  3. mysql 优化300例_PHP+MySQL实现对一段时间内每天数据统计优化操作实例
  4. C++十进制转二进制
  5. 云炬随笔20210803
  6. Python, CPython, Pypy, Jython的简单介绍
  7. 网易模板html,163企业邮箱HTML网站模板
  8. oracle 如何形成死锁,ORACLE死锁
  9. 流式计算优化:时效性 [王方浩视角]
  10. [实践篇] Softmax Regression