首页 > 其他分享 >CF1485F Copy or Prefix Sum 题解

CF1485F Copy or Prefix Sum 题解

时间:2023-11-10 21:37:05浏览次数:35  
标签:int 题解 sum Prefix mp mod Copy mo define

思路

考虑 \(a_i\) 要么是 \(b_i\) 要么是 \(b_i - s\)。

考虑 \(s\) 代表着什么。

它是 \(a\) 的前缀和。

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

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

考虑设 \(f_i\) 为这个位置填 \(b_i\) 的方案数。

\(g_i\) 为这个位置填与 \(b_i\) 不同的 \(b_i - s\) 的方案数。

那么有:

\[f_i=f_{i-1}+g_{i-1} \]

\[g_i=\sum_{j=1}^{i-1}g_j[sum_{i-1}-sum_{j-1}\not = 0] \]

下面这个式子可以直接哈希表优化,实现使用的 \(\text{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;
}

标签:int,题解,sum,Prefix,mp,mod,Copy,mo,define
From: https://www.cnblogs.com/mfeitveer/p/17825092.html

相关文章

  • [POI2011] SMI-Garbage 题解
    题目链接显然,对于初始颜色与目标颜色不同的边,我们需要走过奇数次;对于初始颜色与目标颜色相同的边,我们需要走过偶数次。对于只有偶数边的情况,这种情况下不走就行;对于只有奇数边;可以理解为每条边只能经过一次,就是欧拉路径问题,并且考虑这题的特殊性质,如果一个图是由若干个简单环构......
  • CSP-S2019 江西 题解
    为什么有\(5\)道题?[CSP-S2019江西]和积和简单化一下式子:\[(n+1)\times\sumA_i\timesB_i-(\sumA_i)\times(\sumB_i)\]其中\(A,B\)都是前缀和。[CSP-S2019江西]网格图naive的kruskal是很naive的,所以需要一点简单的优化。考虑其本质过程就是按照......
  • CF1485E Move and Swap 题解
    不要什么脑子的带\(log\)做法。思路考虑\(dp_{i,j}\)表示红点到\(i\),蓝点到\(j\)的最大权值。那么有:\[dp_{i,j}=\max(dp_{fa_i,pre},dp_{fa_j,pre})+|a_i-a_j|\]其中\(pre\)是任意一个上一层节点。发现第二维没有用。可以优化:\[dp_i=\max(dp_{fa_i}+\max(|a_i-a_......
  • APISIX源码安装问题解决
    官网手册的安装语句:curlhttps://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh-sL|bash-执行install-dependencies.sh报如下错误:Transactioncheckerror:file/usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.pyfrominstal......
  • 苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<signal.h>#include<setjmp.h> //foralongjumpjmp_bufenv;//forsavinglonjmpenviromentintcount=0;voidhandler(intsig,......
  • CSP-2019-S 题解
    做了这套题,如果是让现在的我当时去考的话应该一共可以有450分,格雷码,括号树,树的重心都可以做,树上的数可以有10分,Emiya至少可以有76分,划分也可以有64分。看OIerDB上可以有166名的好成绩。我的代码合集:洛谷/云剪贴板[CSP-S2019]格雷码首先是格雷码有一个很好的生......
  • CF1428F Fruit Sequences 题解
    使用了一种和大多数题解不同的做法。虽然是带\(log\)的。思路首先考虑如何求一个固定左端点的答案。我们发现,每个答案会随着右端点的递增单调不降。而每个答案在增加时会形成若干个区间。例如:11101010111111我们答案增加的区间即为:11100000000111可以发现,这个区间就......
  • 【洛谷 P1980】[NOIP2013 普及组] 计数问题 题解(取余)
    [NOIP2013普及组]计数问题题目描述试计算在区间到的所有整数中,数字()共出现了多少次?例如,在到中,即在中,数字出现了次。输入格式个整数,之间用一个空格隔开。输出格式个整数,表示出现的次数。样例#1样例输入#1111样例输出#14提示对于的数据,,。思路求每个数字的......
  • [ABC286G] Unique Walk 题解
    洛谷题目链接At题目链接这题一看就很欧拉路径,但是怎么做呢?如果只有关键边,那么连通图首先会变成一堆连通块,这时只需要分别对每个连通块进行欧拉路径判断,但是对于不属于欧拉路径的连通块,很难对加上非关键边的情况进行扩展。如果只有非关键边,那么连通图还是变成一堆连通块,但是这......
  • 题解 P4630 [APIO2018] 铁人两项
    具体思路题目问的是三元组\((x,z,y)\)使得\(x\)可以到达\(z\),且\(z\)可以到达\(y\),求三元组\((x,z,y)\)的数量。我们转化一下问题,就是问\(x,y\)之间所有不重复路径的点的并集减\(2\)。显然,无向图中任意一个点都属于一个点双连通分量。那么问题转化为\(x,y\)之......