hackerrank:Almost sorted interval

时间:2022-06-01 20:08:02

题目链接:https://www.hackerrank.com/challenges/almost-sorted-interval

题目大意:

定义一个“几乎单调”区间(区间最小值在最左面,最大值在最右面)

给一个N的排列,求“几乎单调”区间的个数

N=100W  解法为O(n)

很好的思维题!

想了一下午,其实自己离正解已经不远了,,不过最后还是看了学长的ac代码

然后基本上秒懂了

具体思维方式不好说啊。。贴个代码,以后又不会了的话慢慢回忆吧= =||

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
#include<queue>
using namespace std;
#define MAXN 10000
deque<int> qinc;
deque<int> qdec;
int a[];
int num[];
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
num[i]=;
}
long long ans=;
for(int i=;i<n;i++)
{
scanf("%d",a+i);
}
for(int i=;i<n;i++)
{
if(qinc.empty())
{
qinc.push_back(a[i]);
}
else
{
int tmp=qinc.back();
while(tmp>a[i])
{
num[qdec.back()]--;
if(num[qdec.back()]==)
qdec.pop_back();
qinc.pop_back();
if(qinc.empty())
break;
tmp=qinc.back();
}
qinc.push_back(a[i]);
}
if(qdec.empty())
{
qdec.push_back(a[i]);
ans++;
continue;
}
int tmp=qdec.back();
while(tmp<a[i])
{
num[a[i]]+=num[tmp];
qdec.pop_back();
if(qdec.empty())
break;
tmp=qdec.back();
}
ans+=num[a[i]];
qdec.push_back(a[i]);
}
cout<<ans<<endl;
return ;
}