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;
}
posted @ 2025-03-22 22:51  zxh923  阅读(21)  评论(0)    收藏  举报