ARC100E. Or Plus Max
好题。没想出解法。
官方题解:
这个解法和 Small Multiple 那道题的解法有异曲同工之妙。
扩展
若把 \(\mathsf{or}\) 改成 \(\mathsf{and}\) 或者 \(\mathsf{xor}\) 怎么解?
代码
int main() {
int n;
scan(n);
vi a(1 << n);
scan(a);
vpii b(1 << n);
rng (i, 0, 1 << n) {
b[i] = {i, -1};
}
auto cmp = [&](int x, int y) {
if (x == y) return false;
if (x == -1) return false;
if (y == -1) return true;
return a[x] > a[y];
};
auto update = [&](pii &a, pii b) {
vi x{a.first, a.second, b.first, b.second};
sort(all(x), cmp);
UNIQ(x);
a = {x[0], x[1]};
};
rng (i, 0, 1 << n) {
rng (j, 0, n) {
if (!get_bit(i, j)) {
update(b[i | 1 << j], b[i]);
}
}
}
int ans = 0;
rng (i, 1, 1 << n) {
chkmax(ans, a[b[i].first] + a[b[i].second]);
println(ans);
}
return 0;
}
Exec Time: 206 ms.
但是改成
int main() {
int n;
scan(n);
vi a(1 << n);
scan(a);
vv<int> b(1 << n);
rng (i, 0, 1 << n) {
b[i] = {i};
}
auto cmp = [&](int x, int y) {
return a[x] > a[y];
};
auto update = [&](vi &a, vi &b) {
vi tmp = a;
tmp.insert(tmp.end(), all(b));
sort(all(tmp), cmp);
UNIQ(tmp);
a = {tmp[0], tmp[1]};
};
rng (i, 0, 1 << n) {
rng (j, 0, n) {
if (!get_bit(i, j)) {
update(b[i | 1 << j], b[i]);
}
}
}
int ans = 0;
rng (i, 1, 1 << n) {
chkmax(ans, a[b[i][0]] + a[b[i][1]]);
println(ans);
}
return 0;
}
Exec Time 416 ms.
仅仅是把pair<int,int>
改为vector<int>
,为何二者运行时间悬殊?