https://atcoder.jp/contests/arc119/tasks/arc119_c
输入 n(2≤n≤3e5) 和长为 n 的数组 a(1≤a[i]≤1e9)。
每次操作,你可以选择两个相邻的数字,把它们都加一,或者都减一。
对于 a 的一个连续子数组 b,如果可以通过执行任意多次操作,使 b 的所有元素为 0,则称 b 为好子数组。
输出 a 的好子数组的数量。
输入
5
5 8 8 6 6
输出
3
发现变化的都是奇数和偶数的位置
无论怎么变化一个区间内 奇数位置的和 == 偶数位置的和
如果一个区间内奇数位置的和 == 偶数位置的和 那么这个区间就符合条件
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 300010;
long long a[N];
int n;
int main (){
cin >> n;
for(int i = 1; i <= n; i ++){
cin >> a[i];
if(i % 2 == 0) a[i] = -a[i];
}
unordered_map<long long,int> cnt;
long long ans = 0;
cnt[0] = 1;
for(int i = 1; i <= n; i ++){
a[i] += a[i - 1];
if(cnt[a[i]])
ans += cnt[a[i]];
cnt[a[i]] ++;
}
cout << ans << endl;
return 0;
}
K倍区间
https://www.acwing.com/problem/content/1232/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
LL res;
LL a[100010], s[100010];
int cnt[100010];
int main ()
{
int n, k;
cin >> n >> k;
for(int i = 1; i <= n; i ++){
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
cnt[0] = 1;
for(int i = 1; i <= n; i ++){
res += cnt[s[i] % k];
cnt[s[i] % k] ++;
}
cout << res;
return 0;
}
作者:远方传来风笛
链接:https://www.acwing.com/activity/content/code/content/4957773/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。