标签:style blog http io color os sp for on
题目链接: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[1000010]; int num[1000010]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { num[i]=1; } long long ans=0; for(int i=0;i<n;i++) { scanf("%d",a+i); } for(int i=0;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()]==0) 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 0; }
hackerrank:Almost sorted interval
标签:style blog http io color os sp for on
原文地址:http://www.cnblogs.com/oneshot/p/4152020.html