题解:AtCoder ARC207A Affinity for Artifacts

news/2025/10/20 22:05:27/文章来源:https://www.cnblogs.com/P2441M/p/19153783

题意

给定长度为 \(n\) 的序列 \(a\) 和一个数 \(X\),求有多少种 \(a\) 的重排 \(b\) 使得 \(\sum\limits_{i=1}^n\max(b_i-i+1,0)\leq X\)\(1\leq n\leq 100\)\(1\leq a_i,X\leq 10^9\)

题解

你说得对,但我怎么见过这个 trick?见过了怎么还做不出来呢?

首先考虑把 \(\sum\) 里面的式子写成更喜闻乐见的形式,注意到 \(\max(b_i-(i-1),0)+\min(b_i,i-1)=b_i\),于是我们设 \(S=\sum\limits_{i=1}^na_i,X'=S-X\),把原题条件转化为 \(\sum\limits_{i=1}^n\min(b_i,i-1)\geq X'\)

显然 \(0\leq \sum\limits_{i=1}^n\min(b_i,i-1)\leq \sum\limits_{i=0}^{n-1}i=\dfrac{n(n-1)}{2}\),因此若 \(X'>\dfrac{n(n-1)}{2}\) 则无解,若 \(X'<0\) 则答案为 \(n!\)。这样 \(X'\) 就被限制到了 \(\mathcal{O}(n^2)\) 量级。

看到形如 \(\sum\min(x_i,y_i)\) 的式子,想到将其转化为匹配问题的 trick。具体来说,我们把 \(a_1,\cdots,a_n\) 视作左部点,\(0,\cdots,n-1\) 视作右部点,把这 \(2n\) 个点放一起按权值从大到小排序。从左往右考虑每个点 \(i\),那么我们的决策就是,要么把 \(i\) 和前面某个尚未匹配的不同类型的点 \(j\) 匹配,造成 \(v_i\) 的贡献,要么留着不匹配,等后面的点来匹配它。

容易想到对这个过程 DP。令 \(f_{i,j,k,s}\) 表示考虑前 \(i\) 个数,有 \(j\) 个左部点尚未匹配,有 \(k\) 个右部点尚未匹配,当前匹配的权值和为 \(s\) 的方案数。考虑转移,不妨假设第 \(i\) 个点是左部点,右部点的情况类似。讨论这个点是否和前面的点匹配:

  • \(i\) 个点不匹配:\(f_{i,j,k,s}\leftarrow f_{i,j,k,s}+f_{i-1,j-1,k,s}\)
  • \(i\) 个点和前面的点匹配:此时 \(1\sim i-1\) 中有 \(k+1\) 个右部点,可以任选一个和当前点匹配,于是 \(f_{i,j,k,s}\leftarrow f_{i,j,k,s}+(k+1)f_{i-1,j,k+1,s-v_i}\)

\(s=\mathcal{O}(n^2)\),这样我们就得到了 \(\mathcal{O}(n^5)\) 的做法。

考虑优化。设 \(L_i,R_i\) 分别表示前 \(i\) 个点中左部点、右部点的数量。可以发现,我们能由 \(i,j\) 计算出 \(k\):前 \(i\) 个点中有 \(j\) 个未匹配的左部点,也就会有 \(L_i-j\) 组左右部点的匹配,于是就有 \(R_i-L_i+j\) 个未匹配的右部点。因此我们的 DP 状态可以简化成 \(f_{i,j,s}\),时间复杂度优化至 \(\mathcal{O}(n^4)\),可以通过本题。

代码

#include <bits/stdc++.h>using namespace std;#define lowbit(x) ((x) & -(x))
typedef long long ll;
typedef pair<int, int> pii;
const int N = 101, MOD = 998244353;template<typename T> inline void chk_min(T &x, T y) { x = min(x, y); }
template<typename T> inline void chk_max(T &x, T y) { x = max(x, y); }
inline int add(int x, int y) { return x += y, x >= MOD ? x - MOD : x; }
inline int sub(int x, int y) { return x -= y, x < 0 ? x + MOD : x; }
inline void cadd(int &x, int y) { x += y, x < MOD || (x -= MOD); }
inline void csub(int &x, int y) { x -= y, x < 0 && (x += MOD); }int n, ans, a[N], f[N << 1][N << 1][N * (N - 1) / 2], cnt[N << 1][2];
ll S, X;
pii p[N << 1];int main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n >> X;for (int i = 1; i <= n; ++i) cin >> a[i], S += a[i];X = S - X;if (X > n * (n - 1) / 2) return cout << "0", 0;if (X < 0) {int fc = 1;for (int i = 1; i <= n; ++i) fc = (ll)fc * i % MOD;return cout << fc, 0;}for (int i = 1; i <= n; ++i) p[i] = {a[i], 0}, p[i + n] = {i - 1, 1};sort(p + 1, p + (n << 1) + 1, greater<>());for (int i = 1; i <= n << 1; ++i) cnt[i][0] = cnt[i - 1][0] + !p[i].second, cnt[i][1] = cnt[i - 1][1] + p[i].second;f[0][0][0] = 1;int u = n * (n - 1) / 2;for (int i = 1; i <= n << 1; ++i) for (int j = 0; j <= cnt[i][0]; ++j) {int k = cnt[i][1] - cnt[i][0] + j;if (k < 0 || k > cnt[i][1]) continue;for (int s = 0; s <= u; ++s) {if (p[i].second) {if (p[i].first <= s) cadd(f[i][j][s], (ll)(j + 1) * f[i - 1][j + 1][s - p[i].first] % MOD);if (k) cadd(f[i][j][s], f[i - 1][j][s]);} else {if (p[i].first <= s) cadd(f[i][j][s], (ll)(k + 1) * f[i - 1][j][s - p[i].first] % MOD);if (j) cadd(f[i][j][s], f[i - 1][j - 1][s]);}}}for (int s = X; s <= u; ++s) cadd(ans, f[n << 1][0][s]);cout << ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:Luogu P9260 [PA 2022] Miny

题意 给定一棵 \(n\) 个点的树,第 \(i\) 条边 \((a_i,b_i)\) 有边权 \(c_i\),第 \(i\) 个点有一个爆炸半径 \(r_i\)。当一个点被引爆时,所有在该点爆炸半径范围内的点也会被引爆,这些新的被引爆的点也可能继续引爆…

题解:Luogu P13544 [OOI 2022] Serious Business

题意 给定一个 \(3\times n\) 的网格,每个格子 \((i,j)\) 内有一个数 \(a_{i,j}\)。一个人初始分数为 \(0\),在位置 \((1,1)\) 处,每次可以向右或向下走一格,目标是到达 \((3,n)\)。当走到格子 \((i,j)\) 时,这个…

题解:Luogu P14254 分割(divide)

题意 给定一棵 \(n\) 个点的树,设根节点 \(1\) 的深度为 \(1\)。给定 \(k\),求有多少从树中选出 \(k\) 个两两不同的节点,组成有序序列 \(b_1,\cdots,b_k\) 的方案,使得:对于每个 \(1\leq i<k\),\(1<d_{b_…

31_创蓝短信接入资料和定价

创蓝短信接入资料和定价 公司简介 创蓝云智为企业提供短信、语音外呼、闪验、号码检测、实名认证等通讯类产品,致力于让企业更高效高质量的获得用户及触达用户。 产品类型通知短信 会员营销短信 国际营销短信 验证码短…

构造单

题目来源 取模下序列构造 是否存在 \(3\) 个长度为 \(n\) 的 \([0,n)\) 的排列 \(a,b,c\),使得 \(a_i+b_i=c_i\mod n\) 遇到取模考虑奇偶性,不要像太复杂,考虑 \(n\) 为奇数的时候直接 \(a=b=~0,1,2,3,4,…\),\(c=…

02.Python百行代码实现抽奖系统

02.Python百行代码实现抽奖系统 ------------------------------------------------ 执行后——————————————————————————————————————————————————————————…

[笔记]高斯消元

高斯消元法是求解线性方程组的经典算法。 内容 求解如下的线性方程组(P3389 【模板】高斯消元法): \[\begin{cases} a_{1,1}x_1+a_{1,2}x_2+\dots+a_{1,n}x_n=b_1\\ a_{2,1}x_1+a_{2,2}x_2+\dots+a_{2,n}x_n=b_2\\ …

[SSH] scp:基于 SSH 的安全文件传输

[SSH] scp:基于 SSH 的安全文件传输$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");目录01 简介02 操作2.1 本地发送到远程2.2 从远程下载2.3 主机之间复制…

CSP-S 35

10.2010.20 神秘%你赛,rk1 170 ,你管这叫CSP-S? t1 赛时狂写t1 ,想了半天想出来个神秘做法,时间复杂度不会证但应该是对的,写完本地大阳历1.2s 感觉应该没啥大问题,结果空间炸了,最后2h写的代码和暴力分一样多 …

题解:P11662 [JOI 2025 Final] 方格染色 / Grid Coloring

题目传送门 是一道黄题 这里提供一种 \(O(n\log n)\) 的做法\(\mathscr{PART\ \ ONE}\)我们在手%的时候不难发现(注意力有点也不惊人) 虽然第一列和第一行 不保证有序 但是因为这里的前缀$\ max\ $性质保证了第二列和…

CSP-S 32 多校5

10.1510.15 S-32&&多校5 签到后遗憾离场。 t1 签到题,大力分讨即可。 注意符号。 记得排序(没大阳历时忘排序了) code锵锵 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10;…

CSP-S 33

10.1710.17 t1 签到题 注意到约数只有 \(O(\sqrt n)\) 级别,暴力找约数即可。 唐人当然有唐做法啦! 分解质因数+dfs搜约数 反正唐就对了。 code嘻嘻 #include <bits/stdc++.h> #define int long long #define…

CSP-S 29

10.11 只记录了当时认为有意义的题10.11 t3 赛后才看懂题面 \(\ldots\) 妈妈我会推式子!(骗你的其实我不会) 推完式子就过了。 考虑先求出 \(1\) 为根时的答案,之后换根即可。 开始拆贡献ing 对于根结点,由于一开…

10.20每日总结

今天主要的课程有软件设计,软件开发案例分析,大数据技术,物联网工程。完成了好几项作业,满课还是太忙太累了,软考网课开始第三章。

CSP-S 31

10.1410.14 看大家得分跟信心赛似的,就我一个唐诗写了一场暴力 \(\ldots\) 开场t1没切出来就开始慌了,之后就想着多打暴力拿部分分,导致t2得出的性质没有推广,t3,t4暴力都没写出来(这俩得出性质/部分性质后比暴力…

2025网络安全振兴杯wp

振兴杯wp web1 神探狄仁杰在js和源代码,以及关于里面有flag的base64字段 css中关于的源代码中然后解密就行了 web2Darksale 这个是一个原型链污染 我们发现购买的金额可以被改变我们发现改价格后会回显出来我们尝试修…

ES原理、zookeeper、kafka

ES原理、zookeeper、kafkaES高级 ES底层原理 协调节点是 Elasticsearch 中接收客户端请求、将请求转发到相关数据节点、并汇总最终结果返回给客户端的中心路由节点 Cluster State 是 Elasticsearch 集群的元数据大脑,…

CF1606E Arena 题解(动态规划)

考虑设 \(f_{i,j}\) 表示现在存活 \(i\) 个人,血量最大的人为 \(j\)。这么设是因为注意到有没有胜者其实之和血量最大的是谁,以及有多少个血量最大的有关。 边界情况 \(f_{1,i}=0\)。 考虑转移。如果 \(j<i\),则…

服务器CPU市场概况2025

2025年的服务器CPU市场正处于关键转型期。传统的x86架构(以Intel和AMD为代表)依然占据主导,但基于Arm的解决方案正在快速崛起。随着人工智能(AI)、云计算和高性能计算(HPC)的普及,CPU的设计趋势正在朝着能效优…