【BZOJ】【P1113】【Poi2008】【海报PLA】【题解】【单调队列】
2014-08-05 20:30
337 查看
传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1113
很久以前就看过这道题,觉得好神啊……不会……后来不知从哪看到有一个结论:
从上往下每次覆盖多出来的一块是最优的(不知道怎么证明的),于是想:每次最大值?线段树??不太对……又卡了几天……
忽然有了灵感:每个矩形用一个海报覆盖,最多n个就可以了,如果有连着两个相同的用一个合并,嗯,还是不太对……中间如果有高的话可以先消中间的,那就单调队列吧~
Code:
#include<bits/stdc++.h>
using namespace std;
stack<int>s;
int n,x,y,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
while(!s.empty()&&s.top()>=y){
if(s.top()==y)ans++;
s.pop();
}s.push(y);
}cout<<n-ans<<endl;
return 0;
}
很久以前就看过这道题,觉得好神啊……不会……后来不知从哪看到有一个结论:
从上往下每次覆盖多出来的一块是最优的(不知道怎么证明的),于是想:每次最大值?线段树??不太对……又卡了几天……
忽然有了灵感:每个矩形用一个海报覆盖,最多n个就可以了,如果有连着两个相同的用一个合并,嗯,还是不太对……中间如果有高的话可以先消中间的,那就单调队列吧~
Code:
#include<bits/stdc++.h>
using namespace std;
stack<int>s;
int n,x,y,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
while(!s.empty()&&s.top()>=y){
if(s.top()==y)ans++;
s.pop();
}s.push(y);
}cout<<n-ans<<endl;
return 0;
}
相关文章推荐
- BZOJ 1113: [Poi2008]海报PLA 裸单调栈
- Bzoj1113:[Poi2008]海报PLA:贪心+单调栈
- BZOJ 1113 [Poi2008]海报PLA 单调栈
- [BZOJ 1113][Poi2008]海报PLA:单调栈
- bzoj1113[Poi2008]海报PLA 单调栈
- BZOJ 1113: [Poi2008]海报PLA 单调栈
- BZOJ 1113 [Poi2008]海报PLA 单调栈
- bzoj 1113: [Poi2008]海报PLA
- [bzoj1113][POI2008]海报PLA(单调栈)
- 1113: [Poi2008]海报PLA 单调栈
- bzoj1113 [Poi2008]海报PLA(单调栈)
- 【BZOJ 1113】 [Poi2008]海报PLA
- BZOJ 1113: [Poi2008]海报PLA
- 【BZOJ】【P2096】【Poi2010】【Pilots】【题解】【二分+单调队列】
- 【BZOJ】【P1047】【HAOI2007】【理想的正方形】【题解】【单调队列】
- [单调栈] BZOJ 1113 [Poi2008]海报PLA & BZOJ 1628 [Usaco2007 Demo]City skyline
- BZOJ——T 1113: [Poi2008]海报PLA
- [BZOJ1113][Poi2008]海报PLA(单调栈)
- BZOJ 1113: [Poi2008]海报PLA
- BZOJ 1127 POI2008 KUP 单调队列