返回题解分享
讨论 / 题解分享/ 帖子详情

位运算 - 题解

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
#define int long long
#define rep(i, l, r) for (int i = (l); i <= (r); i ++ )
#define per(i, r, l) for (int i = (r); i >= (l); i -- )
using namespace std;
const int N = 1e5 + 5, M = (1 << 8);
const long long INF = 1e18;
long long value[M][M];
int n, a[N];
void fill_value() {
    for (int x = 0; x < M; x ++ )
        for (int y = 0; y < M; y ++ )
            value[x][y] = -INF;
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n;
    int t = 0;
    rep(i, 1, n) cin >> a[i];
    reverse(a + 1, a + 1 + n);
    fill_value();
    long long ans = 0;
    rep(i, 1, n) {
        int x = (a[i] >> 8), y = (a[i] & (M - 1));
        long long v = 0;
        for (int z = 0; z < M; z ++ )
            v = max(v, value[x][z] + (y & z));
        for (int z = 0; z < M; z ++ )
            value[z][y] = max(value[z][y], v + ((x & z) << 8));
        ans = max(ans, a[i] + v);
    }
    cout << ans << ' ';
    fill_value();
    ans = 0;
    rep(i, 1, n) {
        int x = (a[i] >> 8), y = (a[i] & (M - 1));
        long long v = 0, lst;
        for (int z = 0; z < M; z ++ )
            v = max(v, value[x][z] + (y | z));
        for (int z = 0; z < M; z ++ )
            value[z][y] = max(value[z][y], v + ((x | z) << 8));
        ans = max(ans, a[i] + v);
    }
    cout << ans << ' ';
    fill_value();
    ans = 0;
    rep(i, 1, n) {
        int x = (a[i] >> 8), y = (a[i] & (M - 1));
        long long v = 0, lst;
        for (int z = 0; z < M; z ++ )
            v = max(v, value[x][z] + (y ^ z));
        for (int z = 0; z < M; z ++ )
            value[z][y] = max(value[z][y], v + ((x ^ z) << 8));
        ans = max(ans, a[i] + v);
    }
    cout << ans << ' ';
    return 0;
}
0 回复 0 转发 0 喜欢 3 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!