当前位置: 代码迷 >> 综合 >> Codeforces E. Special Elements (前缀和) (Round #640 Div.4)
  详细解决方案

Codeforces E. Special Elements (前缀和) (Round #640 Div.4)

热度:41   发布时间:2023-12-22 13:43:05.0

传送门

题意: 现有一个数组区间a,定义一种特殊数—数x = sum(al+…+ar),期间(1 <= l <= r <= n)。试问该区间内有多少个特殊数。
在这里插入图片描述

思路:

  • 先将所有数据装桶统计,再进行前缀和处理
  • 由于所有数据不会超过8000,可以直接枚举区间,对于未越界和为加过的数据进行统计,并将已加过的数据进行标记。

代码实现:

#include<bits/stdc++.h>
using namespace std;
const int  N = 2e6 + 5;
int t, n, ans, a[N], mp[N];signed main()
{
    scanf("%d", &t);while(t --){
    scanf("%d", &n);memset(mp, 0, sizeof mp);for(int i = 1; i <= n; i ++){
    scanf("%d", &a[i]);mp[a[i]] ++;  //将数据装桶统计a[i] += a[i - 1];  //前缀和}ans = 0; //开始枚举区间for(int i = 1; i <= n; i ++){
    for(int j = i + 1; j <= n; j ++){
    int sum = a[j] - a[i - 1];if(sum <= n && mp[sum]){
     //防止越界与重复ans += mp[sum];mp[sum] = 0;}}}cout << ans << endl;}return 0;
}
  相关解决方案