G - Bad Hair Day (单调栈)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? G - Bad Hair Day?
題目描述
Farmer John的奶牛在風中凌亂了它們的發型……
每只奶牛都有一個身高hi(1 ≤ hi ≤ 1,000,000,000),現在在這里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80,000)。對于奶牛i來說,如果奶牛i+1,i+2,……,N這些奶牛的身高嚴格小于奶牛i,則奶牛i可以看到它們凌亂的發型。
比如下面這個例子:
* * * * = *
= * * * = *
= * - * = * 奶牛面向這邊-->
= * = * = *
= - = = = *
= = = = = =
1 2 3 4 5 6
('*'表示空的,這是譯者為了格式特意弄的,原題沒有)
令ci表示第i只奶牛能夠看到的發型數量,請計算c1 + c2 + c3 + … + cN的值
對于上面這個例子,答案為3 + 0 + 1 + 0 + 1 + 0=5。
輸入
第一行:奶牛數量N
第二到N+1行:第i+1行輸入奶牛i的身高
輸出
第一行:一個整數即c1到cN的和
樣例輸入
6
10
3
7
4
12
2
樣例輸出
5
?
?
?
首先我們先模擬一下:
身高:? ? ? ? ? ? ?10? ? ?3? ? ?7? ? 4? ? 12? ? 2
牛(下標):? 1? ? ? ?2? ? 3? ? ?4? ? 5? ? ? 6
就以牛1為例子進行模擬:
? 從此過程不難看出,該題和單調棧息息相關,一直在維護棧頂元素
ac代碼:
/*該題利用了單調棧的性質,一直維護棧頂元素 ,棧頂元素每次看到的數字之和即為棧頂元素可以看到的所有數目*/ #include<cstdio> #include<iostream> #include<stack>using namespace std;const int maxn = 8*1e4+5; long long a[maxn];int main() {int n;scanf("%d", &n);for(int i = 0; i < n; i++) scanf("%lld", &a[i]);stack<long long>S;S.push(a[0]);long long sum = 0;for(int i = 1; i < n; i++){while(S.size() > 0&&S.top() <= a[i]) S.pop();sum += S.size();S.push(a[i]);} printf("%lld\n", sum);return 0; }?
總結
以上是生活随笔為你收集整理的G - Bad Hair Day (单调栈)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Multimap的遍历和删除(很重要)
- 下一篇: A. Many Equal Substr