JZOJ 4932. 【NOIP2017提高组模拟12.24】B
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相关推荐
- 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 ...
- JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
Description 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 (a,b)(a,b),若满足 a+b<=na+b 且 a+ba+b 是 abab 的因子,则成为神奇的数对. ...
- 【NOIP2017提高组模拟12.10】神炎皇
题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...
- 【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇
题目描述 降雷皇哈蒙很喜欢雷电,他想找到神奇的电光. 哈蒙有n条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的. 哈蒙想 ...
- NOIP2017提高组模拟赛4 (总结)
NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...
- JZOJ 5182. 【NOIP2017提高组模拟6.29】码灵鼠
Description 码零鼠是一只很喜欢mx数学的神犇,上面那个不是ta本人的样子.这天,ta在研究一个神奇的数列,这个数列是这样的: a0 = 1 an = ai + aj (n>=1, i ...
- 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 ...
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
Description Input Output Sample Input 3 Sample Output 1 Data Constraint Solution 这题我的方法是打表找规律,可以发现答案 ...
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
Description Input Output Sample Input 7 3 Sample Output 4 Data Constraint Solution 这是一道经典的DP问题了,也可以把 ...
最新文章
- Android组件化打造知乎日报系列(一)—— 项目架构搭建
- 在Docker中运行Dubbo应用
- boost asio 简单示例
- 20155203 - 杜可欣 - 预备作业2
- 在服务器搭建深度学习环境随笔
- 学习vue.js的自我梳理笔记
- linux安装ftp后账号密码设置,CentOS 建立ftp账号(vsftpd运用安装与配置疑问 )
- Java 最常见的 200+ 面试题全解析
- win11更新黑屏无法进入系统怎么办 windows11黑屏更新无法进入系统的解决方法
- 拓端tecdat:R语言主成分回归(PCR)、 多元线性回归特征降维分析光谱数据和汽车油耗、性能数据
- html设置flash的背景颜色,flash 如何设置舞台大小和背景颜色?
- 如何修复硬盘的分区表
- 2019-06-12-pintos 实验1
- 直观对比django与DRF
- 66.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。
- HTML<a>,<img>标签介绍及用法
- android自定义控件padding属性无效的解决
- 蓝桥杯训练题1427: [蓝桥杯][2013年第四届真题]买不到的数目【筛选符合题目的数字。有点类似筛素数】
- 华为ensp模拟器占用CPU高问题处理
- 【数据安全】数据脱敏解决方案
热门文章
- 吴恩达 coursera ML 第十二课总结+作业答案
- Matlab中特征选择reliefF算法使用方法(分类与回归)
- mysql 优化300例_PHP+MySQL实现对一段时间内每天数据统计优化操作实例
- C++十进制转二进制
- 云炬随笔20210803
- Python, CPython, Pypy, Jython的简单介绍
- 网易模板html,163企业邮箱HTML网站模板
- oracle 如何形成死锁,ORACLE死锁
- 流式计算优化:时效性 [王方浩视角]
- [实践篇] Softmax Regression