arc100_c. Or Plus Max 题解 高维前缀和
题目链接:https://atcoder.jp/contests/arc100/tasks/arc100_c
解题思路:来自 vectorwyx 大佬的博客
示例程序:
#include <bits/stdc++.h>
using namespace std;
int n;
pair<int, int> a[(1<<18)+5];
void f(pair<int, int> &a, pair<int, int> &b) {
int tmp[5] = { a.first, a.second, b.first, b.second };
sort(tmp, tmp+4, greater<int>());
a = { tmp[0], tmp[1] };
}
int main() {
scanf("%d", &n);
for (int i = 0; i < (1<<n); i++)
scanf("%d", &a[i].first);
for (int i = 0; i < n; i++) {
for (int s = 0; s < (1<<n); s++) {
if ((s >> i) & 1) {
f(a[s], a[s^(1<<i)]);
}
}
}
for (int k = 1, ans = 0; k < (1<<n); k++) {
ans = max(ans, a[k].first + a[k].second);
printf("%d\n", ans);
}
return 0;
}
浙公网安备 33010602011771号