题意
N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们.
(n<=250000,wi,di<=109)
题解
这种一堆矩形,又不像数据结构的题,一般都是单调栈。
考虑一个贪心:对于一个高度,一定要取得尽量宽。
像这样:
然后我们用单调栈求出左边最后一个高度大于等于它的和右边最后一个高度大于等于它的,然后每一个不同的二元组给答案贡献1,用hash判一下重就行了。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<map> 7 using namespace std; 8 pair<int,int> p; 9 map<pair<int,int>,bool>ma; 10 const int N=300000; 11 int n,d[N],stack[N],top,l[N],r[N],ans; 12 int main(){ 13 scanf("%d",&n); 14 for(int i=1;i<=n;i++){ 15 int w; 16 scanf("%d%d",&w,&d[i]); 17 } 18 top=0; 19 for(int i=1;i<=n;i++){ 20 while(d[i]<d[stack[top]]){ 21 r[stack[top]]=i-1; 22 top--; 23 } 24 stack[++top]=i; 25 } 26 while(top){ 27 r[stack[top--]]=n; 28 } 29 for(int i=n;i>=1;i--){ 30 while(d[i]<d[stack[top]]){ 31 l[stack[top]]=i+1; 32 top--; 33 } 34 stack[++top]=i; 35 } 36 while(top){ 37 l[stack[top--]]=1; 38 } 39 for(int i=1;i<=n;i++){ 40 // cout<<l[i]<<" "<<r[i]<<endl; 41 p=make_pair(l[i],r[i]); 42 if(ma[p]==0){ 43 ans++; 44 ma[p]=1; 45 } 46 } 47 printf("%d",ans); 48 return 0; 49 }