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

傳送門

題意: 現有一個數組區間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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章