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();
}