首页 > 其他分享 >P8565 Sultan Rage 题解

P8565 Sultan Rage 题解

时间:2023-10-05 20:57:32浏览次数:36  
标签:P8565 return cur val Rage int 题解 搜索 mp

P8565

发现数列 \(a\) 增长的特别快,项数最多时是 \(a_1 = a_2 = \cdots = a_{100}\),但这样也只会有一百多项就可以超过 \(10^{18}\)。

可以考虑搜索,因为搜索树会比较稀疏,函数 dfs(val, cur) 表示凑出 \(x\) 还需要 \(val\),现在在考虑 \(cur\)。

但光是搜索肯定不能过这道题,考虑优化。

首先,使用记忆化省去重复的搜索,可以用一个 map 来存储。

然后,可以进行可行性剪枝,如果以后再怎么凑都不行,直接剪枝,可以用前缀和优化一下。

但是这样只有 30 分。

可以改变一下搜索的顺序,因为先考虑小元素的话,会有较多的无用的搜索,且小元素较灵活,更容易凑到 \(x\),故可以从大到小的考虑。

这样就可以过了。

注意:判断能否返回时是 mp[cur].conut(val),而不是 mp[cur][val],否则会超时。因为如果这样判断的话,会直接额外开一个节点,对每一层都是如此,但第一次搜索时会额外开 \(2^{dep - 1}\) 个节点,会使后面的搜索查询越来越慢(尽管迟早也要开,等于这样使常数变大了不少)。

时空可过。

const int N = 180, mod = 998244353;
const ll INF = 1e18;
int n, q;
ll a[N], sum[N];
map<ll, int> mp[N];

int dfs(ll x, int cur) {
	if (x < 0 || x > sum[cur]) return 0;
	if (!cur) return (x == 0);
	if (mp[cur].count(x)) return mp[cur][x];
	return mp[cur][x] = (dfs(x - a[cur], cur - 1) + dfs(x, cur - 1)) % mod;
}

int main() {
	int T = read();
	while (T--) {
		n = read(), q = read();
		for (int i = 1; i <= n; i++) a[i] = read();
		int m = n;
		while (a[m] <= INF) {
			a[++m] = 0;
			for (int i = 1; i <= n; i++) a[m] += a[m - i];
		}
		n = m - 1;
		for (int i = 1; i <= n; i++) {
			sum[i] = sum[i - 1] + a[i];
			mp[i].clear();
		}
		while (q--) {
			ll x = read();
			printf("%d\n", dfs(x, n));
		}
	}
	return 0;
}

标签:P8565,return,cur,val,Rage,int,题解,搜索,mp
From: https://www.cnblogs.com/Pengzt/p/17743896.html

相关文章

  • P4133 [BJOI2012]最多的方案 题解
    P4133双倍经验发现斐波那契数列增长极快,不到\(100\)项就超过了\(10^{18}\),搜索树也极为稀疏,可以考虑搜索。爆搜肯定会超时,考虑优化:可行性剪枝。记忆化,去除重复的计算。改变搜索的顺序,因为先考虑小元素的话,会有较多的无用的搜索,且小元素较灵活,更容易凑到\(x\),故可......
  • 【竞赛图】【DP】ARC163D Sum of SCC 题解
    ARC163D发现这个竞赛图一定能被分为两个集合\(A\),\(B\)。满足\(\forallu\inA,v\inB\),均有\(u\tov\inE\)。答案就是划分这两个集合的方案数。证明:首先,竞赛图缩完点后一定是一条链,对强连通分量进行标号,满足编号小的强连通分量指向编号大的强连通分量。不妨令竞赛图\(G\)......
  • 【整除分块】【DP】ABC239Ex Dice Product 2 题解
    ABC239H简单题。令\(f_i\)表示乘到\(\gei\)的期望。容易得到\(f_i=\dfrac{\sum\limits_{j=1}^{n}f_{\lceil\frac{i}{j}\rceil}}{n}\)。将\(f_i\)移到同一边,去掉系数,有\(f_i=\dfrac{n\sum\limits_{j=2}^{n}f_{\lceil\frac{i}{j}\rceil}}{n-1}\)。提出\(\frac{n-1}{n......
  • 【字符串】【哈希】ABC284F ABCBAC 题解
    ABC284F这题的正解是\(Z\)函数。如果\(str=T+T\)的话,若可以找到连续的分别长为\(n\)的两段,且这两段可通过\(1\)次翻转变为相同的字符串,那么便一定有解,否则无解。暴力判断是\(\mathcal{O}(n)\)的,时间复杂度直接上天。可以用哈希\(\mathcal{O}(1)\)地判断出两个......
  • 【组合计数】ARC058D Iroha and a Grid 题解
    ARC058D简单组合计数。可以先把矩形旋转一下,变为求从\((1,1)\)走到\((n,m)\),只能向上或向右移动。且不经过左上角的\(A\timesB\)的禁区的方案数,对\(10^9+7\)取模。假如没有\(A\timesB\)的禁区的话,那么方案数为\(C_{n+m-2}^{n-1}\)。就是一共要走\(n+m-2\)......
  • 「题解」Codeforces Round 883 (Div. 3)
    A.EscalatorConversationsProblem[题目](RudolphandCuttheRope)Sol&Code绳子长度大于钉子高度的要剪#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}in......
  • 「题解」Codeforces Round 888 (Div. 3)
    A.EscalatorConversationsProblem题目Sol&Code签到#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT,n,m,k,h;intmain(){scanf(......
  • 「题解」Codeforces Round 891 (Div. 3)
    A.ArrayColoringProblem题目Sol&Code只有数列的和为偶数时才符合要求,即有任意个偶数,偶数个奇数。将这些数分成两部分,发现两部分初始值\(0\)为偶数,偶数不会影响奇偶性,故需要偶数个奇数。#include<bits/stdc++.h>#defineN51typedeflonglongll;intmin(inta,......
  • P9712 「QFOI R1」贴贴 の 题解
    这道题比较典型。大概就是你先输出solution-,之后再处理其他的。之后遍历字符串,如果发现是大写,就给转成小写,之后输出,如果发现是减号,就输出字符串,都不是就直接输出该字符串的第\(i\)个字符。#include<iostream>#include<string>usingnamespacestd;strings;intlen;int......
  • 实现文档AI搜索,提高问题解决效率
    在当今的数字时代,以AI为动力的文档搜索变得越来越重要。随着在线提供信息的指数增长,传统的搜索方法通常效率低下且耗时。实施文档AI搜索可以显著提高搜索相关文档的效率和有效性。|在网站中实施文档AI搜索的好处很多首先,它通过提供无缝且直观的搜索过程来增强用户体验。借助文档AI......