bzoj 1113 & bzoj 1683 &bzoj 1628 单调栈【经典】

61 篇文章 0 订阅
7 篇文章 0 订阅

题意:n个矩形排成一排,求用最少的矩形cover它们

显然最多n个,即一个矩形用一个去cover

考虑减少所用

对于两个高度相等的矩形,当用同一个矩形覆盖的时候,它们之间所有的矩形的高度都不低于它们的高度

此时答案减1

那么所求可转化为:我们对每一个矩阵,找到它左边第一个不高于它的矩阵,判断高度是否相等,如果相等则所用海报数量-1

此时这个模型一出,显然的裸单调栈

bzoj 1113

var
        n,x,y,top,ans   :longint;
        i               :longint;
        z               :array[0..250010] of longint;
begin
   read(n); ans:=n;
   read(x,y); z[1]:=y; top:=1;
   for i:=2 to n do
   begin
      read(x,y);
      while (top>0) and (y<z[top]) do dec(top);
      if (z[top]=y) then dec(ans);
      inc(top); z[top]:=y;
   end;
   writeln(ans);
end.


bzoj 1683 & bzoj 1628

var
        n,m,x,top,ans   :longint;
        i               :longint; 
        z,h             :array[0..500010] of longint;
begin
   read(n,m);
   for i:=1 to n do
   begin
      read(x); read(h[i]);
   end;
   ans:=n;
   for i:=1 to n do
   begin
      while (top>0) and (h[z[top]]>h[i]) do dec(top);
      if h[i]=h[z[top]] then dec(ans);
      inc(top); z[top]:=i;
   end;
   writeln(ans);
end.



——by Eirlys




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值