思路
首先看题目的要求是求“存在奇数的区间的数量”(因为至少存在一个奇数后才可以使其进行或运算后结果为奇数)
而如果我们直接进行计算后会发现很麻烦(用数组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;
}
喜欢的话别忘了点个赞哦

京公网安备 11010502036488号