Problem


alt


Solution


翻译下题意:当一个区间内存在一个元素为奇数时,则被称为有趣的区间,并且只要两个区间的左右端点有一个不一样,这两个区间就不是同一个区间。
了解题意后,如何求出满足条件的区间个数呢?
我们可以假设数组内所有元素都为奇数,可以很容易地想到,此时的区间个数为1 + 2 + 3 + ... + n。
由此可以看出,我们可以很轻易地求出所有区间数,又因为不满足的区间数为1 + 2 + 3 + ... k(奇数区间的长度)。
所以有趣的区间数 = 所有区间数 - 不满足的区间数。
我们只需要依次找到每个不含奇数的区间长度即可。


Code


#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef long long ll;
const int N = 5e5 + 7;

int a[N];
ll n;

int main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (a[i] & 1) a[i] = 1;  // 标记元素为奇数
        else a[i] = 0;  // 标记元素为偶数
    }
    
    long long res = n * (n + 1) / 2;
    for (int i = 1; i <= n; i++)
    {
        if (a[i] == 0)  // 找到偶数区间
        {
            int k = 1;
            res -= k;
            i++;
            while (i <= n && a[i] == 0)
            {
                k++;
                res -= k;
                i++;
            }
            i--;
        }
    }
    cout << res << endl;
    return 0;
}