我们之前学习了如何使用STL中的队列
现在我们来看一道与队列有关的神奇的题(看似队列而非为队列)————双端队列
分析:
如果现在有一段序列 Ai,Ai+1,Ai+2,······,Aj-1,Aj 满足该双端队列的要求,即满足:
Aj-1<…Ai+1<Ai<Ai+2…<Aj 即如一个二次函数一般的图
所以这道题的本质就在于,找有多少个谷底!!
可以直接处理原始数据,也可以排序后处理下标,我处理的下标
代码如下
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 200100
using namespace std;
struct node{
int v,ps;
}a[200100];
int n;
int mx[200100],mi[200100],cnt=0;
int ans=0,flag=1,now=0x7f7f7f7f;
bool cmp(node A,node B)
{
return A.v<B.v;
if(A.v==B.v)
return A.ps<B.ps;
}
int main()
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].v;
a[i].ps=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(i==1||a[i].v!=a[i-1].v)
{
mx[cnt]=a[i-1].ps;
mi[++cnt]=a[i].ps;
}
}
mx[cnt]=a[n].ps;
for(int i=1;i<=cnt;i++)
{
if(flag==0)
{
if(now>mx[i])
now=mi[i];
else
{
now=mx[i];
flag=1;
}
}
else
{
if(now<mi[i])
now=mx[i];
else
{
flag=0;
now=mi[i];
ans++;
}
}
}
cout<<ans;
return 0;
}