CF1485F Copy or Prefix Sum 题解

思路#

考虑 ai 要么是 bi 要么是 bis

考虑 s 代表着什么。

它是 a 的前缀和。

那么必然是往前一段 b 的和。

因为每个 b 代表着要么是这一位的 a 或者前面所有的 a

考虑设 fi 为这个位置填 bi 的方案数。

gi 为这个位置填与 bi 不同的 bis 的方案数。

那么有:

fi=fi1+gi1

gi=j=1i1gj[sumi1sumj10]

下面这个式子可以直接哈希表优化,实现使用的 map

Code#

/**
 * @file 1485F.cpp
 * @author mfeitveer
 * @date 2023-11-10
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#include <bits/stdc++.h>
using namespace std;

#define x first
#define y second
#define mp(x, y) make_pair(x, y)
#define fro(i, x, y) for(int i = (x);i <= (y);i++)
#define pre(i, x, y) for(int i = (x);i >= (y);i--)
#define dbg cerr << "Line " << __LINE__ << ": "
#define EVAL(x) #x " = " << (x)

typedef int64_t i64;
typedef uint32_t u32;
typedef uint64_t u64;
typedef __int128_t i128;
typedef __uint128_t u128;
typedef pair<int, int> PII;

bool ed;

const int N = 1000010;
const int mod = 1e9 + 7;

int n, m;
i64 all, g[N], f[N], a[N], sum[N];

inline void mo(i64 &x)
	{ x = (x % mod + mod) % mod; }
inline void solve()
{
	cin >> n;
	fro(i, 1, n) cin >> a[i], sum[i] = sum[i - 1] + a[i];
	map<i64, i64> mp; f[1] = all = mp[0] = 1;
	fro(i, 2, n)
	{
		i64 x = all - mp[sum[i - 1]];
		g[i] = x, f[i] = g[i - 1] + f[i - 1];
		mo(g[i]), mo(f[i]);
		all += g[i], mp[sum[i - 1]] += g[i];
		mo(all), mo(mp[sum[i - 1]]);
	}
	cout << (g[n] + f[n]) % mod << "\n";
}

bool st;

signed main()
{
	ios::sync_with_stdio(0), cin.tie(0);
	double Mib = fabs((&ed-&st)/1048576.), Lim = 1024;
	assert(Mib<=Lim), cerr << " Memory: " << Mib << "\n";
	int t; cin >> t;
	while(t--) solve();
	return 0;
}

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/17825092.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(15)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示