POJ 3250 Bad Hair Day - 单调队列

题目描述

分析:

题目大意是求出每只cow能看到的cow的总数的和
转换为:
每只cow能被看到的次数总和
这样就可以用单调队列求解了。
对于每只cow,删掉队列中height小于它的值,ans加上此时队列的长度(就是这只cow会被看到的次数)。再插入这只cow的height。如此求解。
注意:ans要用long long (毕竟80000*80000 > INT_MAX)

#include<cstdio>
#define MAXN 80000

int n,h[MAXN+10],que[MAXN+10];
long long ans;

void read()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&h[i]);
}
void workout()
{
    int front=0,rear=0;
    for(int i=1;i<=n;i++){
        while(front<rear){
            if(que[rear-1]<=h[i])
                rear--;
            else
                break;
        }
        ans+=rear-front;
        que[rear++]=h[i];
    }
    printf("%I64d\n",ans);
}
int main()
{
    read();
    workout();
}
posted @ 2016-02-04 13:42  KatarinaYuan  阅读(86)  评论(0编辑  收藏  举报