P3467(矩形覆盖问题)
Posted iss-ue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3467(矩形覆盖问题)相关的知识,希望对你有一定的参考价值。
描述:https://www.luogu.com.cn/problem/P3467
1.考虑如果整个建筑物链是等高的,一张高为链高,宽为整个建筑物宽的海报即可完全覆盖;
2.若有两个不等高的元素组成建筑物链,那么一定需要两张;
3.因为题目要求海报不可超出建筑物链,那么我们即可用单调栈维护:初始海报数为建筑物数,入栈建筑物链的高度序列,当栈顶大于即将入栈元素时弹栈,若最后弹栈元素与即将入栈元素等高,需要的海报数-1;
4.易证明本方法是正确的:当有两个处于一个峰两侧的等高块时,他们可以用一张海报覆盖,所需海报数显然可减少一个;
#include <bits/stdc++.h> using namespace std; int n,a[250009],b[250009]; int q[250009],p[250009]; map<int,int>m; int ans; int main() { cin>>n; int ans=0; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; int tail=0,head=1; for(int i=1;i<=n;i++) { while(tail>=head&&q[tail]>=b[i]) { if(q[tail]==b[i]) ans++; tail--; } q[++tail]=b[i],p[tail]=i; } cout<<n-ans; }
以上是关于P3467(矩形覆盖问题)的主要内容,如果未能解决你的问题,请参考以下文章