Envy(最大值前後綴 +雙指針 + 二分)

 

Envy

時間限制: 1 Sec  內存限制: 128 MB
提交: 312  解決: 63
[提交][狀態][討論版]

題目描述

今年的 ACM 比賽推出了一個賽後的娛樂活動,所有參賽選手排成一排玩擊鼓傳花,關於擊鼓傳花的玩法是這樣的: 
 
數人或幾十人圍成圓圈坐下,其中一人拿花(或一小物件);另有一人揹着大家或矇眼擊鼓(桌子、黑板或其他能發出聲音的物體),鼓響時衆人開始依次傳花,至鼓停止爲止。此時花在誰手中(或其座位前),誰就上臺表演節目(多是唱歌、跳舞、說笑話;或回答問題、猜謎、按紙條規定行事等);偶然如果花在兩人手中,則兩人可通過猜拳或其它方式決定負者。 
擊鼓傳花是一種老少皆宜的遊戲。 當然,就和大多數的 ACM 題面的套路一樣,我們上面也說了一段廢話,下面我們來說一下正題...... 
 
我們讓 N 個人站成一排,編號爲 1~N,每個人都有一個數字代表他這次比賽的成績,對於每個人,如果他後面(編號大於他的人中)存在一個人的成績大於等於他,那麼他的嫉妒值爲他們之間的距離。兩個點 a和 b 之間的距離爲 abs(a - b)。例如:{4,3,6,2},那麼第 1 個人對第 3 個人有 2 點嫉妒值;第 2 個人對第 3 個人有 1 點嫉妒值,最大嫉妒值爲 2。 

輸入

第 1 行:1 個整數 N,代表這裏有 N 個人(2 <= N <= 50000)。 
接下來的 N 行:每行一個數 Ai(1 <= Ai <= 10^9),  表示第 i 個人的比賽成績。 

輸出

輸出最大嫉妒值。 

樣例輸入

4
4
3
6
2

樣例輸出

2

提示

 

來源

 

[提交][狀態]

 

 

 

 

 

簡直是和here一模一樣

 

 

#include <bits/stdc++.h>
using namespace std;
 
const int MAXN = 1e5 + 5;
 
int a[MAXN];
int b[MAXN];
 
int main()
{
    int n;
    int i, j;
    int ans;
 
    while (~scanf("%d", &n)) {
        scanf("%d", &a[0]);
        b[0] = a[0];
        for (i = 1; i < n; ++i) {
            scanf("%d", &a[i]);
            b[i] = min(b[i - 1], a[i]);
        }
 
        ans = 0;
        j = n - 1;
        for (i = n - 1; i >= 0; --i) {
            while (b[i] > a[j]) {
                --j;
            }
            if (a[i] <= a[j]) {
                ans = max(ans, j - i);
            }
        }
        printf("%d\n", ans);
    }
 
    return 0;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章