[51Nod1671] 货物运输

题意:给出1~n个点,i与i+1有权为1的边,有m个任务同时进行,你可以使用洪荒之力开一个传送门使某个点x到某个点y不需要代价,求完成所有任务的最小代价

题解:

二分+思维

嗯,如果抛开二分,这题基本上就是个纯思维题,乍一看很想运输计划的弱化版,但是运输计划断的是一条边,而这个题则是一条路径

二分最大路径长度,记下所有大于mid的路径,设传送门为(x,y),则这些路径的路线必定是:l -> x -> y -> r

于是我们考虑枚举x,对于某个任务,得出y的范围:mid-(abs(l-x))>=abs(y-r) -> r-mid+abs(l-x)<=y<=r+mid-abs(l-x)

于是得出了每个位置的x对于每个任务的y的范围,则问题转化判断所有的y是否有交

拆开上面式子的绝对值,发现需要分x<l和l<=x两种情况讨论,因为x是共有的未知项,所以只是比较大小的话可以忽略

那么可以预处理忽略掉x的y,最后判断是否有交即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

const int N = 500010;

int n,m,L,ans=1<<30,l1[N],r1[N];

struct Node {
  int l,r;
  bool operator < (const Node &x) const {
    return l<x.l;
  }
}p[N];

struct Dat {int l,r,l1,r1,l2,r2;}q[N];

int gi() {
  int x=0,o=1; char ch=getchar();
  while(ch!=‘-‘ && (ch<‘0‘ || ch>‘9‘)) ch=getchar();
  if(ch==‘-‘) o=-1,ch=getchar();
  while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
  return o*x;
}

bool check(int mid) {
  int cnt=0,top,l2,r2;
  for(int i=1; i<=m; i++) {
    if(p[i].r-p[i].l>mid) {
      cnt++;
      q[cnt].l=p[i].l,q[cnt].r=p[i].r;
      q[cnt].l1=p[i].r-mid+p[i].l,q[cnt].r1=p[i].r+mid-p[i].l;//l>x
      q[cnt].l2=p[i].r-mid-p[i].l,q[cnt].r2=p[i].r+mid+p[i].l;//l<=x
    }
  }
  l1[n+1]=l2=-1<<30,r1[n+1]=r2=1<<30,top=cnt;
  for(int i=n; i>=1; i--) {
    l1[i]=l1[i+1],r1[i]=r1[i+1];
    while(top && q[top].l>i) {
      l1[i]=max(l1[i],q[top].l1);
      r1[i]=min(r1[i],q[top].r1);
      top--;
    }
  }
  top=1;
  for(int i=1; i<=n; i++) {
    while(top<=cnt && q[top].l<=i) {
      l2=max(l2,q[top].l2);
      r2=min(r2,q[top].r2);
      top++;
    }
    if(l1[i]-i<=r1[i]+i && l2+i<=r2-i) {
      if(r1[i]+i>=l2+i && l1[i]-i<=r2-i) return true;
    }
  }
  return false;
}

int main() {
  n=gi(),m=gi();
  for(int i=1; i<=m; i++) {
    int x=gi(),y=gi();
    p[i].l=min(x,y),p[i].r=max(x,y);
    L=max(L,p[i].r-p[i].l);
  }
  sort(p+1,p+m+1);
  int l=0,r=L,mid;
  while(l<=r) {
    mid=(l+r)>>1;
    if(check(mid)) ans=min(ans,mid),r=mid-1;
    else l=mid+1;
  }
  printf("%d", ans);
  return 0;
}
时间: 2024-10-05 03:16:02

[51Nod1671] 货物运输的相关文章

51nod———货物运输 解题报告

公元2222年,l国发生了一场战争. 小Y负责领导工人运输物资. 其中有m种物资的运输方案,每种运输方案形如li,ri.表示存在一种货物从li运到ri. 这里有n个城市,第i个城市与第i+1个城市相连(这里1号城市和n号城市并不相连),并且从i号城市走到i+1号或者从i+1号走到i号需要耗费1点时间. 由于高科技的存在,小Y想到了一种节省时间的好方案.在X号城市与Y号城市之间设立传送站,只要这么做,在X号城市走到Y号城市不需要耗费时间,同样的,从Y号城市走到X号城市也不需要耗费时间. 但是为了防

货物运输 51Nod - 1671

公元2222年,l国发生了一场战争. 小Y负责领导工人运输物资. 其中有m种物资的运输方案,每种运输方案形如li,ri.表示存在一种货物从li运到ri. 这里有n个城市,第i个城市与第i+1个城市相连(这里1号城市和n号城市并不相连),并且从i号城市走到i+1号或者从i+1号走到i号需要耗费1点时间. 由于高科技的存在,小Y想到了一种节省时间的好方案.在X号城市与Y号城市之间设立传送站,只要这么做,在X号城市走到Y号城市不需要耗费时间,同样的,从Y号城市走到X号城市也不需要耗费时间. 但是为了防

HDU 5699 货物运输 二分判定

转自:http://blog.csdn.net/jtjy568805874/article/details/51480479 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int N=1e6+5; const int INF=0x3f3f3f3f; st

bzoj1003: [ZJOI2006]物流运输

dp+最短路.暴力枚举就可以了.O(n3logn).样例中m=n然后测样例过了.然后 54行习惯性的dis[n]然后就WA了!!!. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #de

[ZJOI2006]物流运输

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8278  Solved: 3486 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种 因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是 修改路线是一件十分麻烦的事情,会带来额

洛谷P1772 [ZJOI2006]物流运输

题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是修改路线是—件十分麻烦的事情,会带来额外的成本.因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小. 输入输出格式 输入格式: 第一行是四个整数n(l≤n≤100).m(l≤m≤2

[ZJOI2006]物流运输trans

Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是修改路线是一件十分麻烦的事情,会带来额外的成本.因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小. Input 第一行是四个整数n(1<=n<=100).m(1&

luoguP1772 [ZJOI2006]物流运输 x

P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是修改路线是—件十分麻烦的事情,会带来额外的成本.因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小. 输入输出格式 输入格式: 第一行是四

BZOJ1003 ZJOI2006物流运输trans 0&#39;

Description物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是修改路线是一件十分麻烦的事情,会带来额外的成本.因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小.Input第一行是四个整数n(1<=n<=100).m(1<