题目描述
安安今天的心情特别好,准备去买一些蛋糕犒劳一下自己,蛋糕店的蛋糕是排列成一行的,每个蛋糕有不同的高度,安安不想太过于麻烦,所以买的蛋糕一定要相邻,但是为了不突兀,这些蛋糕中的最高的与第二高的差值应该尽可能小。
输入
正整数n,k,表示蛋糕店蛋糕的数目与大翔子想要买的蛋糕数(1≤k≤n≤1 000 000)接下来是n个正整数,表示第i个蛋糕的高度,高度为大于0小于10 000 000的正整数。
输出
输出一个正整数,表示最小的这些蛋糕中的最高的与第二高的差值。
样例输入
6 3
1 2 3 5 8 5
样例输出
1
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int n,k;
struct tree{
int h1;
int h2;
}dat[maxn * 4];
int a[maxn * 4];
void bulid_tree(int root,int l,int r){
if(l == r){
dat[root].h1 = a[l];
dat[root].h2 = -1;
return;
}
int mid = (l + r) >> 1;
bulid_tree(root << 1,l,mid);
bulid_tree(root << 1 | 1,mid+1,r);
dat[root].h1 = max(dat[root << 1].h1,dat[root << 1 | 1].h1);
dat[root].h2 = max(max(dat[root << 1].h2,dat[root << 1 | 1].h2),min(dat[root << 1].h1,dat[root << 1 | 1].h1));
}
tree query(int a,int b,int root,int l,int r){
if(a <= l && b >= r)return dat[root];
int mid = (l + r) >> 1;
if(a <= mid && b > mid){
tree ans;
tree temp1 = query(a,b,root << 1,l,mid);
tree temp2 = query(a,b,root << 1 | 1,mid + 1,r);
ans.h1 = max(temp1.h1,temp2.h1);
ans.h2 = max(max(temp1.h2,temp2.h2),min(temp1.h1,temp2.h1));
return ans;
}
else if(b <= mid)return query(a,b,root << 1,l,mid);
else return query(a,b,root << 1 | 1,mid+1,r);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> k;
for(int i=1;i<=n;i++)cin >> a[i];
bulid_tree(1,1,n);
// for(int i=1;i<=n*2;i++){
// cout << dat[i].h1 << " " << dat[i].h2 << endl;
// }
int ans = INT_MAX;
for(int i=1;i<=n-k+1;i++){
int j = i + k - 1;
tree temp = query(i,j,1,1,n);
ans = min(ans,abs(temp.h1 - temp.h2));
}
cout << ans;
return 0;
}