• [POI2008]PLA-Postering(单调栈)


    题意

    N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们.

    (n<=250000,wi,di<=109)

    题解

    这种一堆矩形,又不像数据结构的题,一般都是单调栈。

    考虑一个贪心:对于一个高度,一定要取得尽量宽。

    像这样:

    然后我们用单调栈求出左边最后一个高度大于等于它的和右边最后一个高度大于等于它的,然后每一个不同的二元组给答案贡献1,用hash判一下重就行了。

     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 }
    View Code
  • 相关阅读:
    Kentico的UIPager的pagesize不工作
    哈啰单车流量问题
    安卓手机无限重启是怎么回事?
    Kentico的翻译功能
    Remote Desktop Free Manager
    访问存储在服务器中的CDR
    保持观察者状态达到跳出或不迷
    高通IPQ4019
    satixnet satellite modem T1000e
    802.11n 中HT20 HT40的区别和信道划分及plus,minus含义
  • 原文地址:https://www.cnblogs.com/Xu-daxia/p/9433953.html
Copyright © 2020-2023  润新知