题目描述

给出一个长为 n 的序列 A1,A2,…,An

你需要将序列 A 划分成若干个连续段,一段的权值定义为这段内的所有数的按位或。

你需要恰当地选择划分方案,使得每段的权值之和最大。

求出每段的权值之和的最大值。

题目分析:首先题目要求的是n个整数划分之后的与运算,那么我们可以想打,两个数的和一定大于等于两个数的按位与,那么直接就把每个数都分层一个序列,所以最后权值之和就是数组每个数的和

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
ll a[maxn];
int main()
{
    ll n, sum = 0;
    scanf("%lld", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lld", &a[i]);
    for (int i = 1; i <= n; ++i)
        sum += a[i];
    printf("%lld\n", sum);
}