【二分+RMQ】玲珑oj 1149
来源:互联网 发布:算法的乐趣 epub 编辑:程序博客网 时间:2024/05/29 13:44
1149 - Buildings
Time Limit:2s Memory Limit:128MByte
Submissions:820Solved:225
DESCRIPTION
There are n buildings lined up, and the height of the i-th house is hi.
An inteval [l,r](l≤r) is harmonious if and only if max(hl,…,hr)−min(hl,…,hr)≤k.
Now you need to calculate the number of harmonious intevals.
INPUT
The first line contains two integersn(1≤n≤2×105),k(0≤k≤109).The second line contains n integers hi(1≤hi≤109).
OUTPUT
Print a line of one number which means the answer.
SAMPLE INPUT
3 11 2 3
SAMPLE OUTPUT
5
HINT
Harmonious intervals are: [1,1],[2,2],[3,3],[1,2],[2,3].
SOLUTION
“玲珑杯”ACM比赛 Round #19
题意:给定一个序列,问有多少个区间的最值差是小于等于k的;
思路:找到差值小于等于k的最大的区间。固定左端点,枚举由端点,因为区间越大,最大值就越大,最小值越小,即差值越大,具有单调性,所以二分右端点,找到满足差值小于等于k的最大区间,区间最值差用RMQ预处理出来;然后ans+=r-l+1,想一下为什么加上 r-l+1 ?
这道题目无限tle,原因是我把,maxx,minn数组定义成了 long long 型,但是看数据范围根本就没必要,所以特别是定义数组的时候不该用long long 就一定不要用,以防超时;
代码:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;#define N 200010int a[N], lg[N], maxx[20][N], minn[20][N];int query(int l, int r){ int k = lg[r - l + 1];return max(maxx[k][l], maxx[k][r - (1 << k) + 1]) - min(minn[k][l], minn[k][r - (1 << k) + 1]);}void get_a(int n){ for(int i = 1; i <= n; i ++) maxx[0][i] = minn[0][i] = a[i]; for(int i = 2; i <= n; i ++) if(i & (i - 1)) lg[i] = lg[i - 1]; else lg[i] = lg[i - 1] + 1; for(int i = 1; (1 << i) <= n; i ++) { for(int j = 1; j + (1 << i) - 1 <= n; j ++) { maxx[i][j] = max(maxx[i - 1][j], maxx[i - 1][j + (1 << (i - 1))]); minn[i][j] = min(minn[i - 1][j], minn[i - 1][j + (1 << (i - 1))]); } }}int main(){ int n, K; scanf("%d%d", &n, &K); for(int i = 1; i <= n; i ++) scanf("%d", &a[i]); get_a(n); ll ans=0; for(int i = 1; i <= n; i ++) { int l=i,r=n,mid; while(l+1<r) { mid=(l+r)>>1; if(query(i,mid)<=K) l=mid; else r=mid; } if(query(i,r)<=K) ans+=r-i+1; else ans+=l-i+1; } printf("%lld\n",ans); return 0;}
阅读全文
0 0
- 【二分+RMQ】玲珑oj 1149
- 玲珑学院OJ 1149-Buildings-(RMQ+二分)
- 玲珑OJ 1149
- “玲珑杯”ACM比赛 Round #19 B.Buildings【二分+RMQ】
- 玲珑#19 A 数论打表 B RMQ+二分
- 倍增二分——玲珑学院OJ #1112
- SDUT oj 玲珑龟
- 玲珑oj 1074
- 玲珑oj 1072 - Capture
- 玲珑oj Digital Count
- 玲珑OJ 1047
- 玲珑oj 1096
- 玲珑oj 1099
- 玲珑OJ 1100
- 玲珑OJ 1097
- 玲珑oj 1097
- 玲珑OJ-1100
- 玲珑学院OJ 1126
- Linux中Cron任务间隔执行:每隔几分钟/几小时/几天
- WEB应用的Session冲突
- java学习笔记:进制
- C++基础之字符串与指针
- 1025. PAT Ranking (25)
- 【二分+RMQ】玲珑oj 1149
- SVN常用命令
- 筛法快速求解素数
- 用matlab在图像上画矩形框,并保存坐标到文本中
- Codeforces Round 833A-The Meaningless Game
- ios-饼图和柱状图的绘制
- 多线程之初理解
- Linux和Windonws下静态库与动态库(动态库篇)
- HDU3264 Open-air shopping malls【几何】