D. 2+ doors
题意:
构造一个字典序最小且长度为 n n n 的序列满足 q q q 个限制。
限制为 a i ∣ a j = x a_i | a_j = x ai∣aj=x。
题解:
首先,考虑到字典序最小以及逻辑或的性质,以及最简单的情况。
当只有一个限制时,答案显然是 [ 0 , X ] [0,X] [0,X],即可得明显的贪心性质,在二进制上为 1 1 1 的位数尽量给下标大的数。
然后,我们需要考虑解决多个限制冲突的情况。
我们需要预处理 f [ n ] f[n] f[n] ,若存在第 n n n个数的限制中的 x x x 某个二进制位为 0 0 0。
对于第 i i i 个数字,我们需要检查对于第 j j j 个限制,他的某个二进制位是否必须为 1 1 1。
即当前限制的 x x x 的二进制位为 1 1 1 和 另外一个下标 f [ ] f[] f[]为 0 0 0。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n, q;
struct node { int v, w; };
vector<node>G[100010];
int main() {
cin >> n >> q;
vector<ll>f(n + 2, (1 << 30) - 1);
while (q--) {
int u, v, w; cin >> u >> v >> w;
f[u] &= w, f[v] &= w;
G[u].push_back({ v,w });
G[v].push_back({ u,w });
}
for (int i = 1; i <= n; i++) {
ll t = 0;
for (auto p : G[i]) {
t |= p.w & ~f[p.v];
if (p.v == i)t = p.w;
}
f[i] = t;
cout << t << " ";
}
return 0;
}