Date:2022.01.22
题意
农夫约翰的 N 头奶牛排成一排,每头奶牛都用其品种 ID 进行描述。
如果两头相同品种的牛靠得太近,它们就会吵架。
具体的说,如果同一品种的两头奶牛在队列中的位置相差不超过 K,我们就称这是一对拥挤的牛。
请计算品种 ID 最大的拥挤奶牛对的品种 ID。
输入格式
第一行包含两个整数 N 和 K。
接下来 N 行,每行包含一个整数表示队列中一头奶牛的品种 ID。
输出格式
输出品种 ID 最大的拥挤奶牛对的品种 ID。
如果不存在拥挤奶牛队,则输出 −1。
数据范围
1≤N≤50000,
1≤K<N,
品种 ID 范围
[
0
,
1
0
6
]
。
[0,10^6]。
[0,106]。
思路:用队列维护一个长度为k+1的滑动窗口,双指针尺取区间长度为k+1。
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
const int N = 5e4+10;
typedef long long LL;
queue<LL>q;
LL a[N],n,k;
map<LL,LL>mp;
int main()
{
cin>>n>>k;
LL maxx=-1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(i<=k+1)
{
q.push(a[i]);mp[a[i]]++;
if(mp[a[i]]>=2) maxx=max(maxx,a[i]);
}
}
for(int i=k+2;i<=n;i++)
{
LL jin=i,chu=i-k-1;
mp[a[chu]]--;mp[a[jin]]++;
q.pop();q.push(a[jin]);
if(mp[a[jin]]>=2) maxx=max(maxx,a[jin]);
}
cout<<maxx;
return 0;
}