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