题解 | 有趣的区间(补集思想+组合数学)
有趣的区间
https://www.nowcoder.com/practice/40929e3b2f2e4ca2a481f242f8ffca71
很显然的补集思想+组合数学。不难得出包含任意奇数的区间都为有趣的区间,单步容斥可得所有区间个数减去无趣区间个数即为有趣区间个数,而无趣区间为全为偶数的区间。优化计数可用组合数学,即连续的最大无趣区间包含的无趣区间个数只与区间长度有关,因此可实现时间复杂度为的计数。
天冷了,请多喝热水,祝您拥有美好的一天!
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+5;
int n, a[N];
signed main() {
cin>>n;
int ans=n*(n-1)/2+n, cnt=0;
for(int i=1; i<=n; i++) {
cin>>a[i];
if(a[i]%2==0) ++cnt;
else {
if(cnt) ans-=cnt*(cnt-1)/2+cnt;
cnt=0;
}
}
if(cnt) ans-=cnt*(cnt-1)/2+cnt;
cout<<ans;
}
