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

题意: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




相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页