E
随便计算一下就可以。
枚举其中一维的差值,然后另一维做前缀和即可。
F
考虑交换相邻即可。
G
首先可以考虑随机赋值,大概率线性无关。
然后将邻居的 $g_i$ 丢进线性基,其实表示的是一个方程 $=0$。
线性基中的每个组合的异或结果都是 0。
从 $x=1$ 开始到 $x=n$ 考虑对阶梯头依次解出每个的值即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| ll p[66]; void ins(ll x){ for(int i=59;i>=0;i--){ if(x>>i&1){ if(!p[i]){ p[i]=x; } x^=p[i]; } } }
void solve() { int n,m; cin>>n>>m; vl g(n); rep(m){ int a,b;cin>>a>>b; a--,b--; g[a]^=1LL<<b; g[b]^=1LL<<a; } rep(n)ins(g[i]); vl h(n); rep(t,50){ rep(n){ if(!p[i]){ h[i]=rng()%(1LL<<60); }else{ h[i]=0; rep(j,i)if(p[i]>>j&1)h[i]^=h[j]; } }
bool ok=true; rep(n)if(!h[i])ok=false; if(ok){ cout<<"Yes\n"; rep(n)cout<<h[i]<<" \n"[i+1==n]; return; } } cout<<"No\n"; }
|