Gym - 100886B 2015-2016 Petrozavodsk Winter Training Camp, Saratov SU Contest B - Game on Bipartite

题目有很强的结论,看代码应该可以知道结论是什么
但是想了两天还是没有想到一个严格的证明
大概思路:
首先边的奇偶影响答案(走过去优就继续拓展,不优就走回来)
转化为01问题
考虑消元的过程中,对面的一个点会发生什么
如果这个点可以成为主元,说明从这个点出发一定会有奇数长度的路径(即便是双方交替进行)
↑感性认识一下感觉非常有道理,然而并不会证(sad
然后基于这个结论就可以做了,把其他所有点的出边情况送进去消元,消完后再把起点也丢进去判断是否会被消掉
因为这是公平博弈,所以可以用相同方法判断对方在某个点的胜负,故可以产生方案

UPD:
似乎是后手只要不断把先手往基上拉,先手就会输,所以要看起点能不能被消掉
先手不往基上走为啥会赢我没搞清楚,感觉与行列消元得到的主元相同有联系

Thx to yjq

#include
#include
#include
#define N 51
typedef long long ll;

int n,m,e,v,edg[N][N],d1[N],d2[N];
ll row[N],col[N],pivot[N];

inline bool add(ll mask) 
{
	for (int i=1;i>i&1) 
	{
		if (pivot[i]) mask^=pivot[i]; 
		else {pivot[i]=mask;return 1;}
	}
	return 0;
}


inline void go(int t)
{
	printf("%d\n",t);
	fflush(stdout);
	--edg[v][t];
	--d1[v];
	row[v]^=1LL<

你可能感兴趣的:(CodeForces,构造)