首先将奇数记为1,偶数记为0
subtask1:只有一个奇数或偶数(20pts)
找到当前唯一的奇数或偶数的下标记为 index,每次查询其是不是在区间内
- 不在区间内直接输出
0
- 在区间内: 输出 (index - L + 1) \times (R - index + 1) - 1
- 数组本身都是
0
或1
也输出0
subtask2:枚举所有区间(70 + 20pts)
枚举从左端点出发,枚举右端点,并且记录这个区间是否有1或0,如果都有那么 ans++
code:
LL ans = 0;
for(int j = l; j <= r; j++)
{
for(int k = j + 1; k <= r; k++)
{
if(node[k].b - node[j - 1].b > 0 && node[k].a - node[j - 1].a > 0)
{
ans++;
}
}
}
没错 O(n^3) 可以拿到 90pts
!!!(信友队数据还是太水了)
subtask3:正解(20+70+10pts)
直接偷懒!
核心code:
int in = 0;
int r1 = min(R[l], r);
int len1 = r1 - l + 1;
in += len1 * (len1 - 1) / 2;
int l2 = L[r];
int len2 = r - l2 + 1;
in += len2 * (len2 - 1) / 2;
if (idx2 - 1 >= idx1 + 1)
{
in += pre[idx2 - 1] - pre[idx1];
}
cout << sum - in << '\n';