題目連結: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 }