1. 程式人生 > >Poj3250 Usaco2006Nov銀組 Bad Hair Day

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