bzoj 2756 奇怪的遊戲(最大流)

2021-08-14 12:21:29 字數 1400 閱讀 7791

傳送門biu~

對棋盤進行黑白染色。設黑格個數為num0,數值和為sum0;白格個數為num1 數值和為sum1。

最後都變為x,則num0 * x – sum0 = num1 * x – sum1,所以x = (sum0 – sum1) / (num0 – num1)。當num0 ≠ num1時,可以解出 x 再用網路流驗證;當num1 = num2時,可以發現對於乙個合法的x k>=x都是乙個合法的解。所以可以二分x,再用網路流驗證。

建圖時,如果點k為白,建邊(s, k, x – v[k]);如果為黑,建邊(k, t, x – v[k]);相鄰點u、v (u為白)

建邊 (u, v, inf)。

#include

using

namespace

std;

const

long

long inf=1ll<<50;

long

long sum0,sum1;

int num0,num1;

int n,m,cnt,s,t;

int xx[4]=,yy[4]=;

int a[45][45],color[45][45];

int head[2005],fir[2005],dep[2005],nex[20005],to[20005],tp;

long

long cap[20005];

inline

void add(int x,int y,long

long c)

inline

void insert(int u,int v,long

long w)

inline

int bfs()}}

return dep[t];

}long

long dfs(int x,long

long now)

}return c;

}inline

long

long dinic()

return c;

}inline

bool check(long

long x)

}else insert((i-1)*m+j,t,x-a[i][j]);

return (dinic()==tot);

}int main()

}for(int i=1;i<=n;++i)

}if(num0!=num1)

}printf("-1\n");

}else

long

long l=max,r=inf;

while(l<=r)

printf("%lld\n",l*num1-sum1);}}

return

0;}

BZOJ2756 奇怪的遊戲(二分,網路流)

bzoj blinker最近喜歡上乙個奇怪的遊戲。這個遊戲在乙個 n m 的棋盤上玩,每個格仔有乙個數。每次 blinker 會選擇兩個相鄰 的格仔,並使這兩個數都加上 1。現在 blinker 想知道最少多少次能使棋盤上的數都變成同乙個數,如果永遠不能變成同 乙個數則輸出 1。輸入的第一行是乙個整...

2756 SCOI2012 奇怪的遊戲

time limit 40 sec memory limit 128 mb submit 3052 solved 840 submit status discuss blinker最近喜歡上乙個奇怪的遊戲。這個遊戲在乙個 n m 的棋盤上玩,每個格仔有乙個數。每次 blinker 會選擇兩個相鄰 的...

bzoj2756 SCOI2012 奇怪的遊戲

description blinker最近喜歡上乙個奇怪的遊戲。這個遊戲在乙個 n m 的棋盤上玩,每個格仔有乙個數。每次 blinker 會選擇兩個相鄰 的格仔,並使這兩個數都加上 1。現在 blinker 想知道最少多少次能使棋盤上的數都變成同乙個數,如果永遠不能變成同 乙個數則輸出 1。inp...