icpc:problems:even_subarrays
目录
problems | |
---|---|
名称 | even_subarrays |
题目编号 | 841C |
题目链接 | codeforces.com/… |
来源 | CodeForces |
算法分类 | 前缀和, 位运算 |
难易程度 | 难 |
even_subarrays
想法
首先需要知道:
- 异或具有交换律和逆运算
- 异或可以前缀和
- 偶数个因数就是非完全平方数
所以这道题目需要一个桶,然后从前往后扫描,用前缀和的方式来求区间,用桶的数量来累计区间的个数。
最后答案逆运算一下就好了。
代码实现
#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 由 温婕莺