蛋糕序列

题目描述
安安今天的心情特别好,准备去买一些蛋糕犒劳一下自己,蛋糕店的蛋糕是排列成一行的,每个蛋糕有不同的高度,安安不想太过于麻烦,所以买的蛋糕一定要相邻,但是为了不突兀,这些蛋糕中的最高的与第二高的差值应该尽可能小。

输入
正整数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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值