Poj3250 Usaco2006Nov银组 Bad Hair Day

问题是求一个数往右边看,在遇到大于等于他本身的之前,有多少个比他小的数

正难则反,转化问题为一个数能被多少个数看到,算贡献,那么这些的和就是答案

用单调栈去处理,把栈里的比当前处理的数要小于等于的全弹掉,剩下的那些就是严格比这个数大的,也就是可以看到这个数的
ans要开long long

#include <iostream>  
#include <cstdio> 
#include <stack> 
using namespace std;  
stack <int> s;
int N;  
int num;
long long ans;
int main()  
{  
  	cin >> N;
  	for(int i=1; i<=N; i++) {
  		cin >> num;
  		while(!s.empty() && s.top() <= num) s.pop();
  		ans += s.size();
  		s.push(num);
  	}
    printf("%lld\n", ans);  
    return 0;  
} 
posted @ 2018-11-02 14:23  Zolrk  阅读(89)  评论(0编辑  收藏  举报