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