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";
}