题目链接:点击查看

题目大意:给出 nnn 个人,再给出 nnn 个指定位置,每个人每秒钟可以向上下左右四个方向移动一个单位,问最少需要多长时间,才能使所有人都到达指定位置

题目分析:数据比较小,可以直接二分时间然后跑最大流 checkcheckcheck,输出路径也是中规中矩的,注意行末空格就好啦

代码:

// Problem: ★★体育课排队★★
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/16520/B
// Memory Limit: 524288 MB
// Time Limit: 8000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=2e3+100;
struct Edge
{int to,w,next;
}edge[N*N*2];//边数
int head[N],cnt;
void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;//反向边边权设置为0edge[cnt].next=head[v];head[v]=cnt++;
}
int d[N],now[N];//深度 当前弧优化
bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}
int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}
void init()
{memset(now,0,sizeof(now));memset(head,-1,sizeof(head));cnt=0;
}
int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}
int n,m;
int x[N],y[N],s[N],xx[N],yy[N];
bool check(int mid) {init();int st=N-1,ed=st-1;for(int i=1;i<=n;i++) {addedge(st,i,1);addedge(i+n,ed,1);}int tot;for(int i=1;i<=n;i++) {tot=0;for(int j=1;j<=m;j++) {for(int k=0;k<s[j];k++) {tot++;if(abs(x[i]-(xx[j]+k))+abs(y[i]-yy[j])<=mid) {addedge(i,tot+n,1);}}}}return solve(st,ed)==n;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--) {read(n),read(m);for(int i=1;i<=n;i++) {read(x[i]),read(y[i]);}for(int i=1;i<=m;i++) {read(s[i]),read(xx[i]),read(yy[i]);}int l=0,r=5000,ans=0;while(l<=r) {int mid=(l+r)>>1;if(check(mid)) {ans=mid;r=mid-1;} else {l=mid+1;}}check(ans);cout<<ans<<endl;int tot=0;for(int j=1;j<=m;j++) {for(int k=0;k<s[j];k++) {tot++;for(int i=head[n+tot];i!=-1;i=edge[i].next) {int to=edge[i].to;if(to>=1&&to<=n&&edge[i].w==1) {printf("%d%c",to,k==s[j]-1?'\n':' ');break;}}}}}return 0;
}

兰州大学第一届『飞马杯』程序设计竞赛 - ★★体育课排队★★(二分+最大流)相关推荐

  1. 兰州大学第一届『飞马杯』程序设计竞赛(同步赛),签到题ACFHJ

    序 题号 标题 通过率 我的状态 A ★★比赛新机制★★ 309/1537 通过 (找规律+前缀和维护) (longlong记得开1e18,我1e15WA了一个多小时) B ★★体育课排队★★ 1/1 ...

  2. 兰州大学第一届『飞马杯』程序设计竞赛 - ★★飞马祝福语★★(动态dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss ,现在有 mmm 次操作,每次操作可以修改 [l,r][l,r][l,r] 内的字符为 chchch,问每次修改之后的字符串内含 ...

  3. 兰州大学第一届『飞马杯』程序设计竞赛 - ★★平形四边行★★(鸽巢原理+暴力)

    题目链接:点击查看 题目大意:二维平面坐标系上给出 nnn 个点,现在需要求出四个点,满足四个点可以组成可退化的平行四边形 题目分析:因为坐标的范围很小,所以瞬间想到了上周刷到的一道题目的模型: Co ...

  4. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  5. 兰州大学第一届 飞马杯 体育课排队 二分 + 最大流 + 输出路径

    传送门 文章目录 题意: 思路: 题意: 思路: 读懂题就会辣,经典模型了,二分时间,让后将其转换成二分图,左边是人,右边是位置,能在规定时间到的连边,跑匹配即可. // Problem: ★★体育课 ...

  6. 冠军出炉!2022『猛犸杯』国际组学数据创新大赛圆满收官

    2022 MICOS 2月26日,由中国生物信息学学会(筹).广东省科技基础条件平台中心指导,深圳国家基因库.鹏城实验室.深圳华大生命科学研究院主办的2022『猛犸杯』国际组学数据创新大赛(2022 ...

  7. 华为杯大学生计算机软件大赛,关于举办2018年西安电子科技大学程序设计网络赛暨第十六届“华为杯”大学生程序设计竞赛的通知...

    各学院: 程序设计是大学生运用计算机充分展示自己分析问题和解决问题能力的一个重要途径,对于培养大学生实践能力.团队意识.创新意识.顽强意志和综合素质具有显著作用和效果.为了推动这项创新性素质教育活动的 ...

  8. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)解题报告

    第八届"图灵杯"NEUQ-ACM程序设计竞赛个人赛(同步赛) 题目总结 A题 切蛋糕 题目信息 解题思路 如果我们将 1/k展开到二进制的形式,那么就可以计算出 需要 多少块1/( ...

  9. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛题解

    第八届"图灵杯"NEUQ-ACM程序设计竞赛个人赛题解 先抱怨一下,这场比赛的题锅太多了,而且正赶上状态不好,Ac 1/12就离谱.. H 数羊 给定n,m(1≤n≤109,0≤m ...

最新文章

  1. html 多项选择,选项标签中的HTML多字段选择
  2. iphone退款申请教程_王者荣耀账号注销退钱吗?王者荣耀账号注销100%退款教程...
  3. PCA主成分分析/协方差矩阵
  4. Thinking in work
  5. 我的教师生涯2:大学毕业前当上了孩子王
  6. django与easyui使用过程中遇到的问题
  7. java8.0 platform图_Java Platform SE binary语言-Java编程32位/64位版(jdk-jeb)下载V8.0.2510.8官方安装版-西西软件下载...
  8. 金士顿u盘真假软件_简洁轻巧 金士顿DT80 Type-C高速闪存盘评测
  9. [USACO4.2] 草地排水 Drainage Ditches (最大流)
  10. Bailian4151 电影节【贪心】
  11. [收藏]Linux 常用命令
  12. TM2008 Preview体验
  13. css设置div圆角
  14. 安卓手机模拟路由器 测试WIFI信道遍历
  15. 阿里80亿贷款细节曝光 并购背后图谋大数据
  16. 量子研究再获突破能否成功解决核潜艇通信难题?
  17. 小动物立体定位架的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. Excel中使用名称定义常数
  19. 台式机耳机插上没声音_如何在台式机上使用移动耳机麦克风
  20. 做软件测试工程师真的很容易吗?

热门文章

  1. c语言 实现sizeof功能,C语言简单实现sizeof功能代码
  2. springboot热部署工具
  3. Apollo产品对比
  4. SpringSecurity remember功能基本实现
  5. zookeeper的设计猜想-Observer角色
  6. Netty 采用NIO 而非AIO 的理由
  7. 完成AOP 顶层设计-AopProxy
  8. canal数据同步(canal安装)
  9. 单点登录Redis存储Session及SessionId问题说明与集群实战-4
  10. htc u11 android o,HTC U11+和HTC U11有什么区别?对比完秒懂 (全文)