BZOJ1683: [Usaco2005 Nov]City skyline 城市地平線 單調棧

Description

這裏寫圖片描述
Input
第1行:2個用空格隔開的整數N和W.

第2到N+1行:每行包括2個用空格隔開的整數x,y,其意義如題中所述.輸入中的x嚴格遞增,並且第一個z總是x.

Output
輸出一個整數,表示城市中最少包含的建築物數量.

Sample Input
10 26
1 1
2 2
5 1
6 3
8 1
11 0
15 2
17 3
20 2
22 1

INPUT DETAILS:

The case mentioned above
Sample Output
6
題解:
用單調棧來維護,橫着的行並沒有什麼用,只需考慮豎着的列即可,求出可以減少的覆蓋量,可以減少的情況是指在兩列的高度是相同的(因爲覆蓋的樓是矩形),並且兩列之間沒有比他們高度小的,當單調棧退棧時,若有此種情況,那麼計數器++,最後ans爲n-計數器(因爲最差的情況是用n個才能解決) 代碼如下:

#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
const int MAXN=1000001;
int s[MAXN];
int main(int argc, char *argv[])
{
    int n,a,b,top=0,cnt=0,t,w; 
    scanf("%d%d",&n,&w);t=n;
    s[++top]=0;
    while(t--)
    {
        scanf("%d%d",&a,&b);
        while(b<=s[top]&&top)
        {
            if(b==s[top]) cnt++;
            top--;
        } 
        top++;
        s[top]=b;
    }
    printf("%d\n",n-cnt);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章