2020杭电多校赛第四场1007 Go Running(hdu6808)

1007 Go Running(hdu6808)

题意:有一条无限长的跑道,有一些人正在以1m/s的速度匀速跑步,有一台检测机在 t i t_i ti检测到有同学在 x i x_i xi的位置,询问最少有多少个人在跑步。

解法:首先可以建立一个直角坐标系,横坐标代表时间,纵坐标代表位置,对于1m/s的匀速运动,那么一个人的运动轨迹在这样一个坐标系中斜率肯定是1或-1,那么题意就可以转换成将这些点斜率为1和-1的直线画出来,之后再看经过所有点的最少直线。
在这里插入图片描述
如果将这个图顺时针转动45度,可以想到这是二分图匹配的经典问题,最小点覆盖=最大匹配,这里我用了网络流的方法实现,建立超级源点和超级汇点。具体建边方式就是源点连向所有涉及到的行权值为1(注意重复的不叠加),所有涉及到的列连向汇点权值为1(注意重复不叠加),再对于每个点行和列建一条权值为1的边,再跑一边最大流就行。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int M = 2e5+10;
const int INF = 0x3f3f3f3f;
struct xx {
   
  int x, y, a, b, lx, ly;
}p[N];
bool cmp1(const xx &p1, const xx &p2) {
   
  return p1.a < p2.a;
}
bool cmp2(const xx &p1, const xx &p2) {
   
  return p1.b > p2.b;
}

struct node {
   
  int to, dis, next;
}Ed[M*2];
int head[M], cur[M], d[M], cnt <
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值