傳送門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...