T1涛涛的数学课题解

首先将奇数记为1,偶数记为0

subtask1:只有一个奇数或偶数(20pts)

找到当前唯一的奇数或偶数的下标记为 index,每次查询其是不是在区间内

  1. 不在区间内直接输出0
  2. 在区间内: 输出 (index - L + 1) \times (R - index + 1) - 1
  3. 数组本身都是01也输出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)

屏幕截图 2025-06-07 152922

直接偷懒!
核心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';
1 个赞

%%%tql!