有趣的区间
x是奇数 ⇔ x的二进制最低位为1
A[l] | ...|A[r]为奇数 ⇔ A[l~r]至少有一个数是奇数
设以A[i]为右端点, 考虑它的左端点(<=i)能取哪些位置:
(1) 如果A[i]为奇数, 左端点可以随便取, 因为包含了A[i]这个奇数, 有i+1个
(2) 如果A[i]为偶数, 设上一个奇数在last, 那么[0,last]都可以取, 因为包含了A[last]这个奇数, 有last+1个
所以用一个变量记录最近的奇数位置, 从前往后遍历统计即可
import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in), 65535));
static int I() throws IOException {
st.nextToken();
return (int) st.nval;
}
public static void main(String[] args) throws Exception {
int n = I();
boolean[] A = new boolean[n];//A[i]:是否为奇数(不关心大小,只看奇偶)
for (int i = 0; i < n; i++) A[i] = I() % 2 == 1;
long ans = 0;
int last = -1; // 上一个奇数索引位置
for (int i = 0; i < n; i++) { // 枚举右端点
if (A[i]) { // A[i]为奇,左端点在[0,i]随便取
ans += i + 1; // i+1种选择
last = i; // 更新最近奇数位置
} else { // A[i]为偶, 左端点在[0,last]随便取
ans += last + 1; // last+1种选择
}
}
System.out.println(ans);
}
}