璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:even_subarrays
problems
名称even_subarrays
题目编号841C
题目链接codeforces.com/…
来源CodeForces
算法分类前缀和, 位运算
难易程度

even_subarrays

想法

首先需要知道:

  1. 异或具有交换律和逆运算
  2. 异或可以前缀和
  3. 偶数个因数就是非完全平方数

所以这道题目需要一个桶,然后从前往后扫描,用前缀和的方式来求区间,用桶的数量来累计区间的个数。

最后答案逆运算一下就好了。

代码实现

#include<iostream>
#include<vector>
#include<cstring>
 
const int N = 2 * 1e5 + 10;
 
int line[N];
 
int main()
{
	int T;
	long long int n, ans;
	std::cin >> T;
	while(T--)
	{
		std::cin >> n;
		for (int i = 1; i <= n; ++i) 
			std::cin >> line[i];
 
		std::vector<int>vis(2*n+10);
		ans = 0;
		long long int sum = 0;
		vis[sum] ++;
 
		for (int i = 1; i <= n; ++i) {
			sum ^= line[i];
			for (int j = 0; j*j <= 2*n; ++j) {
				if((sum xor (j*j)) < 2 * n)
				{
					ans += vis[(sum xor (j*j))];
				}
			}
			vis[sum] ++;
		}
 
		std::cout << (n + 1) * n / 2 - ans << std::endl;
	}
 
	return 0;
}
/app/www/public/data/pages/icpc/problems/even_subarrays.txt · 最后更改: 2023/09/30 14:00 由 温婕莺