P9384 [THUPC 2023 決賽] 著色

Fire_Raku發表於2024-07-05

P9384 [THUPC 2023 決賽] 著色

思維題+構造

三元環還可以,五元環有點抽象,考慮將其全歸為奇環,那麼題目就變成:求一種設邊權的方案,使得只用邊權 \(i\) 無法構成奇環。

那麼這個限制等價於只保留邊權為 \(i\) 的邊的圖是二分圖,那麼一條邊的兩個端點得是不同屬性。考慮怎麼構造二分圖,看到 \(0∼9\) 的邊權和 \(n\) 的範圍,考慮將其對應到二進位制上每個位。構造方式:兩點 \(i\)\(j\) 之間連邊權為 \(ctz(i\oplus j)\)

證明這樣連邊的合法性,邊權 \(i\) 連線的兩個端點二進位制上第 \(i\) 位一定不同,就將點分為了兩類(第 \(i\) 位為 \(1\) 或為 \(0\)),此時如果保留邊權為 \(i\) 的邊,一定為二分圖。

複雜度 \(O(n^2)\)

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define mk std::make_pair
#define fi first
#define se second
#define pb push_back

using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;

int n;
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	std::cin >> n;

	for (int i = 1; i < n; i++) {
		for (int j = 1; i + j <= n; j++) {
			std::cout << __builtin_ctz(i ^ (i + j)); 
		}
		std::cout << "\n";
	}	

	return 0;
}

相關文章