GDOI2017模擬8 12 躲藏

2021-07-16 15:02:09 字數 1826 閱讀 4329

給出乙個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辣麼大就知道是矩乘可是不會做...