题解:AT_abc352_d [ABC352D] Permutation Subsequence
Network_Flow · · 题解
D.Permutation Sequence
题意简述:
给一个从
sol:
容易想到暴力做法,从
考虑优化,如果我们将这些数映射到一个
至于单调队列的写法,这里不再赘述。有需要请左转 P1886 滑动窗口 /【模板】单调队列。
#include <iostream>
#include <cstdio>
#include <deque>
#include <map>
using namespace std;
int n, k, a[200005], maxn, minn, p;
deque<int> qMax, qMin;
map<int, int> s;
//单调队列求最大最小
void slidemax(int pos){
while(!qMax.empty()&&qMax.front()<=pos-k) qMax.pop_front();
while(!qMax.empty()&&s[qMax.back()]<=s[pos]) qMax.pop_back();
qMax.push_back(pos);
}
void slidemin(int pos){
while(!qMin.empty()&&qMin.front()<=pos-k) qMin.pop_front();
while(!qMin.empty()&&s[qMin.back()]>=s[pos]) qMin.pop_back();
qMin.push_back(pos);
}
int main(){
scanf("%d%d", &n, &k);
for (int i=1; i<=n; i++){
scanf("%d", &a[i]);
s[a[i]]=i; //将值和下标映射对应起来
}
int ans=0x3f3f3f3f;
for (int i=1; i<=n; i++){
slidemin(i);slidemax(i); //窗口滑动
if(i>=k) ans=min(ans, s[qMax.front()]-s[qMin.front()]);
}
printf("%d\n", ans);
return 0;
}