【二分+RMQ】玲珑oj 1149

来源:互联网 发布:算法的乐趣 epub 编辑:程序博客网 时间:2024/05/29 13:44

1149 - Buildings

Time Limit:2s Memory Limit:128MByte

Submissions:820Solved:225

DESCRIPTION

There are nn buildings lined up, and the height of the ii-th house is hihi.

An inteval [l,r][l,r](lr)(l≤r) is harmonious if and only if max(hl,,hr)min(hl,,hr)kmax(hl,…,hr)−min(hl,…,hr)≤k.

Now you need to calculate the number of harmonious intevals.

INPUT
The first line contains two integersn(1n2×105),k(0k109)n(1≤n≤2×105),k(0≤k≤109).The second line contains nn integers hi(1hi109)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][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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 把售后给的备用机摔坏了怎么办 苹果4s屏幕玻璃碎了怎么办 苹果手机摔鼓起来了屏幕花了怎么办 苹果8卡屏幕划不动了怎么办 苹果x卡屏幕划不动了怎么办 苹果5s解锁密码忘了怎么办 苹果6s屏幕摔碎了怎么办 苹果手机掉在水里了怎么办 乐视手机掉水里没法触屏了怎么办 乐视电视有声音但是黑屏怎么办 苹果手机微信语音有回音怎么办 苹果4s死机了没反应了怎么办 苹果手表的显示平坏了怎么办 苹果5s屏幕翘起来了怎么办 苹果手机圆点卡住屏幕不能动怎么办 苹果5s卡屏怎么也不动应该怎么办 苹果5s手机触摸屏太灵敏怎么办 苹果5s手机关机滑动失灵怎么办 苹果5s关机开机后没信号怎么办 苹果手机5s被弄关机了怎么办 华为荣耀5c换屏后触摸失灵怎么办 三星笔记本鼠标触摸板没反应怎么办 有米6x触摸屏不好使怎么办? 小米5s屏幕触摸没反应怎么办 苹果5s主屏幕设置没反应怎么办 华为畅享5s接听不灵怎么办 红米3s忘记锁屏密码怎么办 华为畅享5s手机打不开网络怎么办 苹果手机突然关机开不了机怎么办 苹果手机掉地上开不了机怎么办 oppo手机突然黑屏开不了机怎么办 苹果6s为什么开不了机怎么办 苹果手机还原出厂设置白苹果怎么办 捡到苹果6s手机怎么办才能自己用 苹果6s玩游戏卡住了怎么办 苹果6s进水换屏后指纹失灵怎么办 苹果手机6s声音按键失灵怎么办 苹果手机触屏失灵怎么办5s 苹果六摔了一下屏幕失灵怎么办 荣耀5c进水屏幕触摸屏失灵怎么办 生活玩家打不了风云蝙蝠岛怎么办啊