其实这道题不是很难,不难想到f[i]表示覆盖到[0,i]的最少喷头数

很明显是一个dp+单调队列的问题

但是细节问题比较多,首先是不能覆盖到[0,l]外面,所以长度为奇数不能被完全覆盖

还有一些区间[bi,ei]只能被一个喷头覆盖,这意味着[0,s],bi<s<ei也是不能被完全覆盖的

标记一下就好了

最后注意判断一下是否可行

 const inf=;
type node=record
       x,y:longint;
     end;
var f,q:array[..] of longint;
    can:array[..] of boolean;
    a,b:array[..] of longint;
    p,n,l,w,v,i,j,h,t,ans:longint; procedure sort(l,r: longint);
  var i,j,x,y: longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) shr ];
    repeat
      while a[i]<x do inc(i);
      while x<a[j] do dec(j);
      if not(i>j) then
      begin
        swap(a[i],a[j]);
        swap(b[i],b[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end; procedure merge;
  var l,r:longint;
  begin
    l:=a[];
    r:=b[];
    t:=;
    for i:= to n do
    begin
      if a[i]<r then r:=max(r,b[i])
      else begin
        if r-l>v* then
        begin
          writeln(-);
          halt;
        end;
        inc(t);
        a[t]:=l;
        b[t]:=r;
        l:=a[i];
        r:=b[i];
      end;
    end;
    if r-l>v* then
    begin
      writeln(-);
      halt;
    end;
    inc(t);
    a[t]:=l;
    b[t]:=r;
  end; begin
  readln(n,l);
  readln(w,v);
  for i:= to n do
    readln(a[i],b[i]);
  sort(,n);
  merge;
  for i:= to t do
    for j:=a[i]+ to b[i]- do
      can[j]:=true;
  f[]:=;
  h:=;
  t:=;
  for i:= to l do
  begin
    f[i]:=inf;
    p:=i-*w;
    if (p>=) then
    begin
      while (t>) and (h<t) and (f[q[t-]]>=f[p]) do dec(t);
      if not can[p] then
      begin
        q[t]:=p;
        inc(t);
      end;
    end;
    if (can[i]) or (i mod =) then continue;
    while (h<t) and (q[h]<i-*v) do inc(h);
    if (h<t) then f[i]:=f[q[h]]+;
  end;
  if f[l]>=inf then writeln(-) else writeln(f[l]);
end.
const inf=;
type node=record
       x,y:longint;
     end;
var f,q:array[..] of longint;
    can:array[..] of boolean;
    a,b:array[..] of longint;
    p,n,l,w,v,i,j,h,t,ans:longint; procedure sort(l,r: longint);
  var i,j,x,y: longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) shr ];
    repeat
      while a[i]<x do inc(i);
      while x<a[j] do dec(j);
      if not(i>j) then
      begin
        swap(a[i],a[j]);
        swap(b[i],b[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end; procedure merge;
  var l,r:longint;
  begin
    l:=a[];
    r:=b[];
    t:=;
    for i:= to n do
    begin
      if a[i]<r then r:=max(r,b[i])
      else begin
        if r-l>v* then
        begin
          writeln(-);
          halt;
        end;
        inc(t);
        a[t]:=l;
        b[t]:=r;
        l:=a[i];
        r:=b[i];
      end;
    end;
    if r-l>v* then
    begin
      writeln(-);
      halt;
    end;
    inc(t);
    a[t]:=l;
    b[t]:=r;
  end; begin
  readln(n,l);
  readln(w,v);
  for i:= to n do
    readln(a[i],b[i]);
  sort(,n);
  merge;
  for i:= to t do
    for j:=a[i]+ to b[i]- do
      can[j]:=true;
  f[]:=;
  h:=;
  t:=;
  for i:= to l do
  begin
    f[i]:=inf;
    p:=i-*w;
    if (p>=) then
    begin
      while (t>) and (h<t) and (f[q[t-]]>=f[p]) do dec(t);
      if not can[p] then
      begin
        q[t]:=p;
        inc(t);
      end;
    end;
    if (can[i]) or (i mod =) then continue;
    while (h<t) and (q[h]<i-*v) do inc(h);
    if (h<t) then f[i]:=f[q[h]]+;
  end;
  if f[l]>=inf then writeln(-) else writeln(f[l]);
end.

poj2373的更多相关文章

  1. [USACO2004][poj2373]Dividing the Path(DP+单调队列)

    http://poj.org/problem?id=2373 题意:一条直线分割成N(<=25000)块田,有一群奶牛会在其固定区域吃草,每1把雨伞可以遮住向左右延伸各A到B的区域,一只奶牛吃草 ...

  2. poj2373 Dividing the Path (单调队列+dp)

    题意:给一个长度为L的线段,把它分成一些份,其中每份的长度∈[2A,2B]且为偶数,而且不能在某一些区间内部切开,求最小要分成几份 设f[i]为在i处切一刀,前面的满足要求的最小份数,则f[L]为答案 ...

  3. poj2373 Dividing the Path

    Dividing the Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5060   Accepted: 1782 ...

  4. DP总结 ——QPH

    常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一 ...

随机推荐

  1. General Palindromic Number (进制)

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  2. InnoDB外键使用小结

    USE `wfc_database`; # 主表(也可以称作:被参照表.referenced table.outTable) ALTER TABLE `app` ENGINE=INNODB; # 从表 ...

  3. 统计网卡TX(发送)RX(接受)流量脚本

    显示网卡流量的方法蛮多,一般我们可以通过dstat来查看,但dstat不一定所有的机器都有安装.而我们知道,通过ifconfig可以看到某一网卡发送与接收的字节数,所以我们可以写一个脚本来统计一下. ...

  4. EXTJS4.2 后台管理菜单栏

    EXTJS 代码: 第一种方法: { title: '汽车信息管理', layout: 'fit', items: [ { xtype: 'treepanel', border: 0, rootVis ...

  5. EXTJS 4.2 资料 跨域的问题

    关于跨域,在项目开发中难免会遇到:之前笔者是用EXTJS3.0开发项目的,在开发过程中遇到了关于跨域的问题,但是在网上找到资料大部分都是ExtJs4.0以上版本的 在ExtJs中 例如:Ext.Aja ...

  6. 解决MS Azure 不能ping的问题

    PsPing v2.01 PsPing implements Ping functionality, TCP ping, latency and bandwidth measurement. Use ...

  7. robots.txt协议-互联网robots搜索规范

    最近在看搜索爬虫相关的,挺有趣的,记录一些信息备用. robots.txt官方说明网站 http://www.robotstxt.org/ robots.txt原则 Robots协议是国际互联网界通行 ...

  8. 让wordpress投稿作者在后台只看到自己的文章

    wordpress支持多作者撰写,让更多的人参与网站内容的创建是个不错的想法,UGC(User-generated content)使网站主题更丰富,不同的内容吸引不同的受众,一个好的网站应该多产生U ...

  9. 如何保护 .NET 应用的安全?

    自从 Web 应用能给访问者提供丰富的内容之后,黑客们就把目光转向任何他们能够破坏,损毁,欺骗的漏洞.通过网络浏览器提供的应用越来越多,网络罪犯们可以利用的漏洞数量也呈指数增长起来. 大多数企业都依赖 ...

  10. 【C++基础】sizeof 数组 指针 空NULL

    笔试遇到很多sizeof的小题,博主基础堪忧,怒总结如下,还是要巩固基础啊啊啊! sizeof操作符 对象所占 栈内存空间的大小,单位是字节 关键词:char  数组 指针 结构体 class [注意 ...