BZOJ 1628 [Usaco2007 Demo]City skyline:單調棧

Leohh發表於2017-09-30

題目連結:http://www.lydsy.com/JudgeOnline/problem.php?id=1628

題意:

  

 

 

題解:

  單調棧。

 

  單調性:

    棧內元素高度遞增。

    一旦出現比棧頂小的元素,則表明一棟房子的結束。

 

  入棧:

    如果出現了一個新的高度b(棧中沒有),則入棧。

    表明從現在開始,一定有一棟高度為b的房子,只是我們不知道它在哪裡結束而已。

 

  出棧:

    對於現在的高度b,將棧中所有高度 > b的元素都出棧。

    因為此時比b高的房子不得不結束。

    每出棧一個元素,ans++。

 

  注:最後要再多算一次b = 0,確保將最後一棟房子出棧。

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stack>
 5 
 6 using namespace std;
 7 
 8 int n,w;
 9 int ans=0;
10 stack<int> stk;
11 
12 int main()
13 {
14     cin>>n>>w;
15     int a,b;
16     for(int i=0;i<=n;i++)
17     {
18         if(i<n) cin>>a>>b;
19         else b=0;
20         while(!stk.empty() && stk.top()>b)
21         {
22             stk.pop();
23             ans++;
24         }
25         if(stk.empty() || stk.top()!=b) stk.push(b);
26     }
27     cout<<ans<<endl;
28 }

 

相關文章