Wannafly 挑战赛5 A 题 珂朵莉与宇宙 【思维 + 前缀和】

传送门
//题意: 就是求给你的长度为n的序列的所有子区间中满足该区间的和是一个平方数.
/思路: 开始没想明白, 可能往之前做的一道题上面想去了. 其实想想后觉得也很简单,因为任何一个区间和都可以利用前缀和表示出来, 所以我们只需要判断一下前缀和即可. 即对于每一个前缀和n, 我们都判断一下前面是否出现过的一个前缀和m使得n - m == 一个平方数. 平方数进行枚举就好了(1e3). 并且要记录这种m出现过多少次就行啦.

AC Code

const int maxn = 1e6+5;
int f[maxn];
void solve() {
    int n;
    cin >> n ;
    f[0]++;   //本身的区间和就是一个平方数.
    int sum = 0; ll ans = 0;
    for (int i = 1 ; i <= n ; i++) {
        int u; cin >> u ;
        sum += u;
        for (int j = 0 ; j <= 1000 ; j++) {
            if(sum >= j*j)
                ans += f[sum - j*j];
            else break;
        }
        f[sum]++;
    }
    cout << ans << endl;
}

你可能感兴趣的:(前缀和,想法思维题)