“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)
Posted 贱人方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)相关的知识,希望对你有一定的参考价值。
Start Time:2017-07-29 14:00:00 End Time:2017-07-29 16:30:00 Refresh Time:2017-07-29 16:42:55 Private
Time Limit:2s Memory Limit:128MByte
Submissions:590Solved:151
There are nn buildings lined up, and the height of the ii-th house is hihi.
An inteval [l,r][l,r](l≤r)(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.
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define mp make_pair #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N = 2e5+50; const int mod = 1e9+7; const double pi= acos(-1.0); typedef pair<int,int>pii; int n,k; int a[N]; int mn[N][20],mx[N][20],mm[N]; void init() { for(int j=1; j<=mm[n]; ++j) { for(int i=1; i+(1<<j)-1<=n; ++i) { mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]); mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); } } } int getmx(int l,int r) { int k = mm[r-l+1]; return max(mx[l][k],mx[r-(1<<k)+1][k]); } int getmn(int l,int r) { int k = mm[r-l+1]; return min(mn[l][k],mn[r-(1<<k)+1][k]); } int main(){ mm[0]=-1; for(int i=1; i<N; ++i)mm[i]=(i&(i-1))?mm[i-1]:mm[i-1]+1; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); mn[i][0]=mx[i][0]=a[i]; } init(); int l,r,res; ll ans=0; for(int i=1;i<=n;i++){ l=1;r=i;res=i; while(l<=r){ int mid=(l+r)/2; int maxn=getmx(mid,i); int minn=getmn(mid,i); if(maxn-minn>k)l=mid+1; else r=mid-1,res=mid; } ans+=i-res+1; } printf("%lld\n",ans); return 0; }
以上是关于“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)的主要内容,如果未能解决你的问题,请参考以下文章
“玲珑杯”ACM比赛 Round #19 B -- Buildings
“玲珑杯”ACM比赛 Round #19题解&源码A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp
“玲珑杯”ACM比赛 Round #12 (D) 矩阵快速幂的时间优化