思路

首先看题目的要求是求“存在奇数的区间的数量”(因为至少存在一个奇数后才可以使其进行或运算后结果为奇数)

而如果我们直接进行计算后会发现很麻烦(用数组1 2 4 3 5 举例子):

1.需要统计长度为1的区间的数量

2.区间长度为2时,需要找哪些是不符合的(全是偶数)

3.区间长度为3时,.......(太复杂了不想写了

所以我们要去找只含有偶数的区间的数量

for (int i = 0; i < n; i++)
    {
        if (a[i] % 2 == 0)
        {
            int tmp = 1;
            while (i != n - 1  && a[i] % 2 == 0 && a[i + 1] % 2 == 0 )
            {
                tmp++;
                i++;
            }
            b.push_back(tmp);//每一段只有偶数的区间的长度
		  //比如:用1 2 2 2 1 2 2 1 2 1 2 举例子,此时的b里面会有3 2 1 1 
        }
    }

找出来以后统计一下每一段总工会有多少偶数的区间的数量,再用所有的区间数量作差即可

#include <bits/stdc++.h>
using namespace std;
#define sc second
#define fr first
#define int long long
#define itn long long
#define vi vector<int>
#define vvi vector<vector<int>>
#define pii pair<int, int>
#define endl '\n'
#define enld '\n'
#define all(a) a.begin(), a.end()
#define ui unordered_map<int, int>
const int N = 5e5 + 5;
// const int mod = 998244353;
// const int mod = 1e9 + 7;
int n, m, k, x, y, op, sum = 0, cnt = 0;
string s;
void _()
{
    cin >> n;
    vi a(n), b;
    int num = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++)
    {
        if (a[i] % 2 == 0)
        {
            int tmp = 1;
            while (i != n - 1 /*避免在最后一位为偶数的时候数组越界*/ && a[i] % 2 == 0 && a[i + 1] % 2 == 0 /*检测是否存在连续的偶数区间并将其单个区间的偶数的数量统计到b数组里*/)
            {
                tmp++;
                i++;
            }
            b.push_back(tmp);
        }
    }
    for (int i : b)
    {
        num += (i * (i + 1) / 2); // 该区间中所有的只含有偶数的区间的数量
    }
    cout << n * (n + 1) / 2 - num; // 二者作差即为答案
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int awa = 1;
    // cin >> awa;
    while (awa--)
    {
        _();
    }
    return 0;
}

喜欢的话别忘了点个赞哦