POJ 3250 单调栈模板

来源:互联网 发布:酒店网络设计 编辑:程序博客网 时间:2024/06/06 08:48
http://poj.org/problem?id=3250
题意:从左右给你n头都面向右牛的高度,每头牛能被左边的牛看到当且仅当自己的身高比他低且中间没有障碍物;
求每头牛能看到的牛数量之和;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
const int mod=100000000;
int max(int a,int b)
{return a>b?a:b;};
int min(int a,int b)
{return a<b?a:b;};

int main()
{
int n;
while(~scanf("%d",&n))
{
stack<int>a;
int num;
Ull ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&num);
while(!a.empty()&&a.top()<=num) a.pop();
ans+=a.size();
a.push(num);
}
printf("%lu\n",ans);
}
return 0;
}


分析:利用单调栈,因为要看到就必须保持单调性,因为每个元素都会进栈和出栈一次,所以复杂度把暴力的O(n^2)降到了O(n)
原创粉丝点击