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;
}
posted @ 2026-03-17 16:42  quanjun  阅读(5)  评论(0)    收藏  举报