帮我写一个c语言代码:统计所有两种数字的个数相等的子区间个数,100算一种,小于100算一种。请解释得详细一点
时间: 2024-05-11 11:15:56 浏览: 47
可以用两个变量cnt1和cnt2分别记录当前位置之前小于100和大于等于100的数字的个数差,然后遍历一遍数组,用一个哈希表记录每个cnt1-cnt2出现的次数,最后对于每个cnt1-cnt2,如果它对应的出现次数为cnt,那么它所表示的子区间的个数就是cnt*(cnt-1)/2,因为可以任意选择两个不同位置作为左端点和右端点,但是要保证它们的cnt1-cnt2值相同。
具体实现细节可以参考以下C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100005
#define OFFSET 50
int a[MAXN], cnt[MAXN];
long long cnt1_cnt2[2*MAXN];
long long ans;
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
cnt[i] = cnt[i-1] + (a[i] >= 100 ? 1 : -1);
}
cnt1_cnt2[OFFSET] = 1;
for (int i = 1; i <= n; i++) {
ans += cnt1_cnt2[cnt[i] + OFFSET];
cnt1_cnt2[cnt[i] + OFFSET]++;
}
for (int i = 0; i <= 2*OFFSET; i++) {
ans += cnt1_cnt2[i] * (cnt1_cnt2[i] - 1) / 2;
}
printf("%lld\n", ans);
return 0;
}
```
其中OFFSET是为了避免出现负数而加的偏移量,cnt1-cnt2的范围是-50到50,所以要把它们加上50才能作为数组下标。
阅读全文