[bzoj1113]海报

ans肯定不会超过n,因为我们可以每一列都放一个矩阵
考虑减小答案,肯定是要放横的,也就是让两个高度一样的矩阵同时被消除掉,那么中间不能存在比他们低的矩阵
问题即判断一个点之前第一个小于等于它的点是不是等于他(等于就ans-1),然后用单调栈维护之前的递减即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,ans,a[300005],s[300005];
 4 int main(){
 5     scanf("%d",&n);
 6     for(int i=1;i<=n;i++)scanf("%*d%d",&a[i]);
 7     for(int i=1;i<=n+1;i++){
 8         while ((s[0])&&(s[s[0]]>=a[i]))
 9             if (s[s[0]--]==a[i])ans++;
10         s[++s[0]]=a[i];
11     }
12     printf("%d",n-ans);
13 }
View Code
原文地址:https://www.cnblogs.com/PYWBKTDA/p/11845429.html