給出乙個n*m的網格圖,圖中有一些障礙節點。
現在有a個男生和b個女生,還有乙個小標。
男生要和女生配對,小標可以和任何乙個人配對。
每一對cp(霧)只能待在乙個點。乙個點只能有一對cp。
現在給出a+b+1個人的初始座標,和他們的移動速度(即移動到4相鄰格仔所需的時間)
所有人同時移動,求完成配對的最小時間。
首先,小標的性別完全可以確定,不用管。
然後,我們發現我們要讓最長的移動時間最小。
二分答案,判定顯然用網路流。
如何建模?
首先,因為每個男生和每個女生都要在乙個點,我們不妨把這個點放在中間,左邊男生連它,右邊女生連他。這裡如果有邊相連就表示這個人能夠在二分上界中到達這個點。
每個點拆點,自己連1.表示這裡只能有一對cp。
然後跑最大流就是最多能匹配的cp數,判斷一下就好了。
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,a) for(int i=last[a];i;i=next[i])
#define l 505
#define n 2005
#define m 810005
using namespace std;
typedef long long ll;
const ll inf=1e13;
struct notea[l],b[l],q[n];
int n,m,a,b,s,t,l,x,y,dis[n],d[n];
ll dist[l*2][l],time;
intlast[n],next[m],t[m],f[m],g[4][2]=;
char s[l][l];
void add(int
x,int
y,int z)
int get(int
x,int
y) bool bfs()
int dinic(int
x,int
y) if (!now) dis[x]=-1;
return now;
}bool check(ll x)
void len(int v,int
x,int
y,ll t)
}}int main()
fo(i,1,n) scanf("%s",s[i]+1);
scanf("%d
%d%lld",&x,&y,&time);memset(dist,127,sizeof(dist));
fo(i,1,a) scanf("%d
%d%lld",&a[i].x,&a[i].y,&a[i].t);
fo(i,1,b) scanf("%d
%d%lld",&b[i].x,&b[i].y,&b[i].t);
if (ax=x,a[a].y=y,a[a].t=time;
else b[++b].x=x,b[b].y=y,b[b].t=time;
fo(i,1,a) len(i,a[i].x,a[i].y,a[i].t);
fo(i,1,b) len(i+a,b[i].x,b[i].y,b[i].t);
ll le=1,ri=inf;
while (le2;
if (check(mid)) ri=mid;else le=mid+1;
}if (le==inf) printf("-1");else
printf("%lld",le);
}
GDOI2017模擬8 12 新車
平面上有乙個數軸,e點為目標點。你現在要開 車從w前往e,每移動1格需要1l油。你的油箱容量為s,初始時裝滿了98 汽油。數軸上有n個加油站,每個加油站提供98 95 92 中的一種。到了加油站你可以選擇加任意數量的油,你的油箱是茲瓷所有油甚至混合油的。你認為98 最吼,95 其次,92 跑的最慢。...
GDOI2017模擬11 5 總結
看到第一題,哇,數論題,不會啊,感覺要跪 正當我迷茫的時候,突然機房斷電了。啪的一聲大家的電腦都黑了!不知所措!沒辦法,只好等等。過了10分鐘左右,來電了,重新看了看第一題,也許是冷靜下來了,發現直接暴力分解質因數就能過!繼續看第二題,在草稿紙上推了一下,要用揹包,一開始以為會超時,但仔細想了想發現...
GDOI2017模擬12 3 告別
給出兩個1 n的排列a和b,可以進行m次操作,每次操作隨機選擇乙個三元組 i,j,k 將這個三元組所對應的數在a中進行輪換 即i j,j k,k i 求在m次操作之內將a變成b的概率,答案對998244353取模 n 14,m 1e9 乍一看根本無法下手啊。看到n辣麼小m辣麼大就知道是矩乘可是不會做...