题解:Luogu P10644 [NordicOI 2022] 能源网格 Power Grid

news/2025/10/20 22:11:42/文章来源:https://www.cnblogs.com/P2441M/p/19153801

题意

给定 \(n,m\)。对于 \(n\times m\) 的网格 \(a\),定义

\[c_{i,j}=\left\lvert \sum_{k=1}^{n}a_{k,j}-\sum_{k=1}^{m}a_{i,k} \right\rvert \]

现在给定 \(c\),构造一组合法的 \(a\)。数据保证有解。\(1\leq n,m\leq 10^3\)\(0\leq c_{i,j}\leq 10^3\)

题解

NOIP 模拟赛 T4,很好的构造题。

\(X_{i}=\sum\limits_{j=1}^ma_{i,j}\)\(Y_j=\sum\limits_{i=1}^na_{i,j}\),那么 \(c_{i,j}=\lvert X_i-Y_j\rvert\)

我们考虑先确定 \(X,Y\),再通过 \(X,Y\) 推出 \(a\)。如果我们构造出一组 \(X,Y\) 使得 \(\sum X=\sum Y\),那就可以构造出一组合法的 \(a\)。具体来说:

  • 对于每个 \(1\leq i<n\),令 \(a_{i,m}\leftarrow X_i\)
  • 对于每个 \(1\leq j<m\),令 \(a_{n,j}\leftarrow Y_j\)
  • \(a_{n,m}\leftarrow X_n+Y_m-\sum X\)
  • 对于每个 \(1\leq i<n,1\leq j<m\),令 \(a_{i,j}\leftarrow 0\)

不难发现这样构造后,每个 \(1\leq i<n\) 对应的行和都是 \(X_i\),每个 \(1\leq j<m\) 对应的列和都是 \(Y_j\)。同时可以计算出第 \(n\) 行的和为

\[\left(\sum_{j=1}^{m-1}Y_j\right)+X_n+Y_m-\left(\sum\limits_{i=1}^{n}X_i\right)=X_n \]

\(m\) 列的和可以同理算出是 \(Y_m\)

接下来考虑如何构造一组 \(X,Y\)。考察一个位置 \(u,v\) 使得 \(c_{u,v}\) 取到最大值,那么 \(c_{u,v}\) 要么是 \(\left\lvert \max\limits_{i=1}^n X_i-\min\limits_{i=1}^mY_i \right\rvert\),要么是 \(\left\lvert \max\limits_{i=1}^m Y_i-\min\limits_{i=1}^nX_i \right\rvert\),不妨钦定其为前者,并且钦定 \(X_u=c_{u,v},Y_v=0\)

此时所有的 \(Y\) 必定非负,因此对于每个 \(j\neq v\),我们可以根据 \(c_{u,j}=|X_u-Y_j|\) 确定 \(Y_j=X_u-c_{u,j}\)

接下来对于每个 \(i\neq u\),考察 \(X_i\) 的取值。首先根据 \(c_{i,v}=|X_i-Y_v|=|X_i|\) 可以得出 \(X_i=\pm c_{i,v}\),也就是说 \(X_i\) 至多有 \(2\) 种取值。再根据其他的 \(c_{i,j}\) 可以推出更多关于 \(X_i\) 的限制,最终每个 \(X_i\) 必然是没有合法取值/恰有 \(1\) 种取值/有 \(2\) 种取值的形式。若存在 \(X_i\) 没有合法取值则当前 case 无解。而对于 \(2\) 种取值的 \(X_i\),我们需要引入更多的条件对其加以限制。

考虑我们还漏了什么限制条件。注意到一开始我们钦定了 \(Y_v=0\),然而事实上 \(Y_v\) 可以等于其它非 \(0\) 的数,此时我们需要调整。由于我们需要让所有的 \(X,Y\) 依然满足 \(c\) 的限制,所以只能考虑给 \(X,Y\) 全体加减一个常数 \(k\)。给 \(X,Y\) 全体 \(+k\) 会使得 \(\sum X-\sum Y\) 增加 \(k(n-m)\),我们最终有解的充要条件\(\sum X-\sum Y=0\),因此在钦定 \(Y_v=0\),我们还需要保证得到的 \(\sum X-\sum Y\equiv 0\pmod{|n-m|}\)

那么如何找出一组 \(X\) 满足这个条件呢?考虑背包。对于每个有 \(2\) 种合法取值 \(p,q\)\(X_i\),钦定 \(p\leq q\),我们先令 \(X_i\leftarrow p\),然后将其作为一个体积为 \(q-p\) 的物品扔进背包中。现在所有的 \(X,Y\) 都有了具体值(注意我们只是给 \(X\) 暂定了一个值,不保证合法),然后我们用背包找出这些物品能拼凑出的所有可能的体积总和,找到一个可能的体积总和 \(S\) 满足 \(S\equiv \sum X-\sum Y\pmod{|n-m|}\),然后根据这个 \(S\) 反推回去确定每个 \(X\) 的实际取值。具体来说,用 \(f_{i,j}\) 表示考虑前 \(i\) 个物品,能否选出若干个使得体积总和为 \(j\),转移不再赘述。反推时,设考虑到第 \(i\) 个物品对应的 \(X_k\),若 \(f_{i-1,S}=0\)\(X_k\) 的取值需要更改为当前物品的体积 \(q\),然后令 \(S\leftarrow S-q\) 即可。

注意到值域是 \(\mathcal{O}(nV)\) 量级的,需要用 bitset 把背包优化到 \(\mathcal{O}\left(\dfrac{n^2V}{\omega}\right)\)

这样我们就确定了 \(X,Y\) 的取值,调整后用前文中的方法构造 \(a\) 即可。

对于 \(c_{u,v}\) 的另一种 case,把 \(a\) 转置之后再做一遍即可。

时间复杂度为 \(\mathcal{O}\left(\dfrac{n^2V}{\omega}+nV+nm\right)\)

代码

inline bool check() {int sum = 0;for (int i = 1; i <= m; ++i) sum -= y[i] = c[mxx][mxy] - c[mxx][i];szp = 0;for (int i = 1; i <= n; ++i) {int nx = -c[i][mxy], sx = c[i][mxy];bool suc1 = 1, suc2 = 1;for (int j = 1; j <= m; ++j) {int x1 = y[j] - c[i][j], x2 = y[j] + c[i][j];suc1 &= x1 == nx || x2 == nx;suc2 &= x1 == sx || x2 == sx;}if (!suc1 && !suc2) return 0;if (suc1 && suc2) x[i] = nx, p[++szp] = {i, sx - nx};else x[i] = suc1 ? nx : sx;sum += x[i];}f[0].reset(), f[0][0] = 1;for (int i = 1; i <= szp; ++i) f[i] = f[i - 1] | (f[i - 1] << p[i].second);int s = -1, d = abs(n - m);if (!d) s = -sum;else for (int i = (d - sum % d) % d; i < V; i += d) if (f[szp][i]) { s = i; break; }if (s < 0) return 0;for (int i = szp; i; --i) if (!f[i - 1][s]) x[p[i].first] += p[i].second, s -= p[i].second;if (d) {int sumx = 0, sumy = 0;for (int i = 1; i <= n; ++i) sumx += x[i];for (int i = 1; i <= m; ++i) sumy += y[i];int t = (sumy - sumx) / (n - m);for (int i = 1; i <= n; ++i) x[i] += t;for (int i = 1; i <= m; ++i) y[i] += t;}for (int i = 1; i <= n; ++i) fill(a[i] + 1, a[i] + m + 1, 0);for (int i = 1; i < n; ++i) a[i][m] = x[i];for (int i = 1; i < m; ++i) a[n][i] = y[i];a[n][m] = x[n];for (int i = 1; i < m; ++i) a[n][m] -= y[i];return 1;
}

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

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

相关文章

题解:Luogu P10004 [集训队互测 2023] Permutation Counting 2

题意 给定 \(n\),对于所有 \(0\leq x,y<n\) 求有多少长度为 \(n\) 的排列 \(p\) 满足 \(\sum\limits_{i=1}^{n-1}[p_i<p_{i+1}]=x\) 且 \(\sum\limits_{i=1}^{n-1}[p^{-1}_i<p^{-1}_{i+1}]=y\),答案对给定的…

题解:Luogu P4143 采集矿石

题意 给定长度为 \(n\) 的字符串 \(s\) 和权值序列 \(v\)。求所有子串 \(s[l,r]\) 使得 \(s[l,r]\) 在所有子串去重后的字典序降序排名,恰好等于 \(v[l,r]\) 的区间和。\(1\leq n\leq 10^5\)。 题解 注意到固定左端点…

从18w到1600w播放量,我的一点思考。

你好呀,我是歪歪。 前几天我想要巩固一下共识算法这个知识点。 (先声明,这篇文章不深入讨论共识算法本身) 于是我在 B 站大学上搜索了“共识算法”这个词:我还特意按照播放量排序了一下,准备先找个播放量高点的视…

扣一个细节问题

请看下这个uint bits = 0; for (int y = 0; y < 5; y++) {for (int x = 0; x < 4; x++)bits |= b[y][x] << (y * 4 + x);}上面的代码把一个[5][4]的byte数组用bits表示,该数组里的元素非0即1. 在经典的Th…

10.20java作业

10.20java作业1.2.3.4.5. 结果Parent: myValue = 10 Child: myValue = 20 Child: myValue = 20 Child: myValue = 20 Child: myValue = 21 第一行输出:new Parent() 创建父类对象,调用父类的 printValue 方法,输出父…

题解:Luogu P14175 【MX-X23-T5】向死存魏

题意 给定长度为 \(n\) 的序列 \(a\) 和值域 \(V\)。有 \(m\) 次操作:给定 \(l,r,x\),将 \(a[l,r]\) 中 \(=x\) 的数改为 \(0\)。 给定 \(x\),在序列末尾添加 \(x\)。 给定 \(l\),查询最小的 \(r\) 使得 \(a[l,r]\…

软工第三次作业————结对作业

软工第三次作业————结对作业软工第三次作业--结对作业 软工第三次作业结对作业——实现一个自动生成小学四则运算题目的命令行程序(也可以用图像界面,具有相似功能)项目作业 实现一个自动生成小学四则运算题目的…

Spring 常见注解

目录🧐 @Configuration 和 @Import 的核心区别详细解释1. @Configuration (配置类)2. @Import (引入)参考资料 🧐 @Configuration 和 @Import 的核心区别特性 @Configuration @Import主要目的 标记一个类是 Java 配…

题解:AtCoder ARC208C Mod of XOR

题意 给定 \(C,X\),构造一个 \(n(1\leq n<2^{60})\) 使得 \((n\oplus C)\bmod{n}=X\),或报告无解。多测,\(1\leq T\leq 2\times 10^5\),\(1\leq C,X<2^{30}\)。 题解 神人构造题。 显然要有 \(n>X\)。不妨…

题解:Luogu P6898 [ICPC 2014 WF] Metal Processing Plant

题意 给定 \(n\),对于每个 \(1\leq i,j\leq n\),给出 \(d(i,j)\)。对于集合 \(S\),定义 \(D(S)=\max\limits_{i,j\in S}d(i,j)\)。将 \(\{1,2,\cdots,n\}\) 划分为两个集合 \(A,B\),最小化 \(D(A)+D(B)\)。\(1\leq…

32-腾讯IM接入资料和定价

腾讯IM接入资料和定价信息 一、产品概述 腾讯云即时通信IM(Instant Messaging)是腾讯提供的企业级即时通讯服务,支持多种平台接入,包括Android、iOS、Web和小程序等。 二、定价信息 1. 基础服务资费体验版: 提供完…

题解:AtCoder ARC207A Affinity for Artifacts

题意 给定长度为 \(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\)。 题解 你说得对,但我怎…

题解: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 主机之间复制…