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