CF1485F Cpoy or Prefix Sum 超高质量题解
fanfansann · · 题解
F - Copy or Prefix Sum
Problem F Cpoy or Prefix Sum
Translation
给定一个
Word
Solution
看着这个式子,很明显就是一个DP。
因为题目中
因为有两种情况,所以分类讨论。
当
对于
- 有
f[i][j]=f[i-1][j-b[i]]
当
- 有
f[i][b[i]]=\sum\limits_{j=-min}^{max}f[i-1][j]
不过由于数据过大,我们不能直接开数组,但是数据量小,所以我们可以使用 map 来代替数组,进行转移。
但是我们这样暴力循环递推,并且因为使用到了 map ,所以总的时间复杂度为
我们发现实际上第一个转移方程就是所有的元素全部向右移动
对于第二个转移方程,实际意义就是
最后因为
Code
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef int itn;
const int N = 5e5 + 7, M = 1e6 + 7, mod = 1e9 + 7;
const int INF = 1e9 + 7;
int n, m, t, k, q;
ll x, y;
map<ll, ll>mp;
ll b[N];
void solve()
{
ll deviation = 0, ans = 0;
scanf("%d", &n);
mp.clear();
mp[0] = 1;
ans = 1;
for(int i = 1; i <= n; ++ i) {
scanf("%lld", &b[i]);
}
for(int i = 1; i <= n; ++ i) {
deviation -= b[i];
ll change = ans - mp[b[i] + deviation];
mp[b[i] + deviation] = ans;
ans = ans + change % mod;
}
printf("%lld\n", (ans % mod + mod) % mod);
return ;
}
int main()
{
scanf("%d", &t);
while(t -- ) {
solve();
}
}