QOJ4217 Graph Coloring
首先我们使用惊人的注意力,注意到 \(\binom{14}{7}=3432>3000\)。
于是我们对每个点钦定一个恰好有 \(7\) 个 \(1\) 的 \(01\) 序列,且每个点的序列互不相同。
这样,对于一条边 \(u\rightarrow v\),我们只需要找到一个位置,使得 \(u\) 的序列中这个位置为 \(1\),\(v\) 的序列中这个位置为 \(0\),然后这条边的边权就是这个位置代表的字母。
AC code:
#include<bits/stdc++.h>
#define int long long
#define N 3005
#define pii pair<int,int>
#define x first
#define y second
#define pct __builtin_popcount
using namespace std;
int T=1,n,state[N];
void solve(int cs){
cin>>n;
set<int>s;
for(int i=0;i<1<<14;i++){
if(pct(i)==7){
s.insert(i);
}
}
for(int i=1;i<=n;i++){
state[i]=*s.begin();
s.erase(*s.begin());
}
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
char c;
cin>>c;
if(c=='1'){
int cur=state[i]^state[j];
cur&=state[i];
for(int k=0;k<14;k++){
if(cur>>k&1){
cout<<(char)(k+'a');
break;
}
}
}
else{
int cur=state[i]^state[j];
cur&=state[j];
for(int k=0;k<14;k++){
if(cur>>k&1){
cout<<(char)(k+'a');
break;
}
}
}
}
cout<<'\n';
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// cin>>T;
// init();
for(int cs=1;cs<=T;cs++){
solve(cs);
}
return 0;
}

浙公网安备 33010602011771号