2025-9-23~27 总结

9-23

赌局

情况

  • 时间:\(2h\)
  • 预期:\(100\)
  • 实际:\(40\)

知识点

  • \(\text{dp}\)

思路

我们发现 \(n\)\(a_i\) 都很小,所以可以考虑用 \(\text{dp}\),我们定义 \(dp_{i(0/1/2),j}\) 为第 \(i+1\) 个人得到的赌注的 \(a+b\) 的和不超过 \(j\) 时,\(b\) 的和的最大值,所以我们可以用 \(O(n^3)\) 来解决(因为总和最多为 \(2\times n^2\))。我们接下来再考虑一个问题,如何计算最大值,我们发现答案其实可以转化为三个人赌注均不超过 \(j\) 时的 \(b\) 的和的最大值的总和减去此时的 \(j\),所以最后只需要 \(O(n^2)\) 来统计最大值即可。

注意:由于赌注可以一个都不选,所以求最大值的变量初始化应为 \(0\)

三元组

情况

  • 时间:\(2h\)
  • 预期:\(60\)
  • 实际:\(60\)

知识点

  • 排序

思路

首先我们可以直接把原来的题目改为求以下的式子:

\[\frac{1}{2}\sum_{1\le i,j\le n}max(a_i-a_j,b_i-b_j,c_i-c_j)-min(a_i-a_j,b_i-b_j,c_i-c_j) \]

所以我们可以直接排序之后再贪心求解。现在困难的是如何 \(O(n)\) 排序数组。我其实一开始以为有一种不用排序的方法,然后经过多种尝试后挂掉了。赛后我看到其实数组中的元素在 \((-10^7,10^7)\) 中,所以可以使用桶排序,然后就过了。

9-24

Bot Friends 2

情况

  • 时间:\(2h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • \(\text{Kruskal}\)

思路

我们先记每个点的点权为 \(a_i\),给定图中 \(i\)\(j\) 的最短路为 \(dis(i,j)\),考虑两种情况:

  1. \(a_i=0\):此时答案为原图的最小生成树;
  2. \(a_i>0\):难以刻画给每条边定向的贡献,考虑更改生成树的边权以及代价,定义边权为 \(a_i+dis(i,j)+a_j\) 且代价为边权和,可以发现将这样求出的生成树的代价减去 \(\sum^{n}_{i=1}a_i\) 加上根的点权等于原来的代价,贪心地选取根为 \(a_i\) 最小的点,那么可以在给定图的基础上新建 \(n\) 个虚点并连接 \((i,i+n,a_i)\) 得到图 g,考虑快速求解边权为最短路的最小生成树,记 \(c_i\) 表示与 \(i\) 距离最近的虚点,\(d_i\) 表示 \(i\)\(c_i\) 的最短路,可以发现只需要求解边集 \((c_u,c_v,d_u+d_v+w)\) 构成的最小生成树即可。

所以这样就可以过了。

Increase to make it Increasing

情况

  • 时间:\(1.5h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 网络流

思路

我们考虑差分数组 \(d_i=A_{i+1}-A_i\),我们的目标就是让 \(d_i>0\),其中 \(0\le i<N\)。注意,这里 \(d_N\) 可以小于 \(0\)。在这里我们约定 \(A_p=0\),当且仅当 \(p\notin[1,N]\)。问题转化为:有 \(N+1\) 个人 \(0,1,⋯,N\),其中第 \(N\) 个人有无限的钱,其他的人中,第 \(i\) 个人有 \(d_i\) 块钱,这里 \(d_i<0\) 代表欠钱。\(R_i\) 可以给 \(L_i\) 任意数量的钱,求多少次交易可以还清负债。所以这就是一道网络流的题目了,所以就解决了。

Flint and Steel

情况

  • 时间:\(2h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • \(\text{dp}\),线段树

思路

显然,对于两个苦力怕,如果它们的爆炸区间都包含另一个的爆炸点,不能都炸掉。于是可以暴力 \(\text{dp}\),设 \(dp_i\) 表示引爆第 \(i\) 个苦力怕且杀死该苦力怕爆炸范围右端点前所有苦力怕的最小操作次数,由于 \(O(n^2)\) 会超时,所以我们考虑优化。我们发现转移的过程是个区间最小值,所以我们可以考虑将目前炸死前 \(i\) 个苦力怕的最小操作次数挂到线段树上维护,修改就是将爆炸范围的右端点的原有值和当前点的 \(dp\) 值取 \(\min\),查询的时候就分别对于两种转移进行查询再取 \(\min\) 即可。

+/- Rectangle

情况

  • 时间:\(1h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 贪心

思路

我们应尽可能使得每个 \(h\times w\) 的和都尽可能大,也就是为 \(-1\),所以每 \(h\times w-1\)\(k\)\(k\) 为自己设的数),就有一个 \(-(h\times w-1)\times k-1\),这样只要我们设的 \(k\) 尽可能大,最后就可以为整数,所以我设了 \(k=1000\)

注意:有一种情况是不行的,\(H\)\(h\) 的倍数,\(W\)\(w\) 的倍数,因为正好可以分成 \(\frac{H\times W}{h\times w}\) 个负数矩阵,所以最后也为负数。

Christmas Wreath

情况

  • 时间:\(1h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 贪心

思路

我们首先分心可以发现,当 \(n\le4\)\(n\bmod3=2\) 时,一定不合法,直接输出 No。接下来我们要确保每一个点除之前连接的边外,只能有一种颜色,所以我们暴力染两种颜色即可,最后没染到的输出最后一种颜色即可。

Permutation Oddness

情况

  • 时间:\(1.5h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • \(\text{dp}\)

思路

首先我们可以发现异或并取 lowbit 后,得到 \(2\) 的组合只有 \(\{0,2\},\{1,3\}\),没有贡献(为 \(0\))的组合是相邻相同,剩余的全都是 \(1\),其次考虑给 \(0,2\) 的位置染红色,\(1,3\) 的位置染蓝色。那么整个序列中造成 \(1\) 贡献的缝隙恰为二者极长连续段数之和 \(−1\);造成 \(2\) 贡献的就是每一段内部的交替次数。所以我们先可以用 \(\text{dp}\) 算出红蓝独立的贡献。最后枚举红色的段数 \(i_r\) 以及蓝色的段数 \(i_b\in\{i_r-1,i_r,i_r+1\}\),把这些段整体排列之后,枚举 \(j_r,j_b\) 表示各自的 \(2\) 的贡献,则 \(r_{i_r}\times b_{i_b}\) 可以贡献到 \(an_{i_r+i_b-1+2(j_r+j_b)}\),所以输出答案即可。

Esoswap

情况

  • 时间:\(1.5h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 构造

思路

因为位置固定,所以要交换的另一个位置所需要的值也是固定的,如果被换走了,就再也换不到了。所以先可以在 \(0\) 的前面一直操作,他最后也会变成 \(0\) ,而且他一定会在变成 \(1\) 后变成 \(0\) ,因为要和后一位交换。于是你从前往后一直这样操作,最后就可以将 \(0\)\(1\) 换到最前面,而且在换第 \(0\) 位的时候,如果你的值是 \(x\) ,那他一定会被换到第 \(x\) 位。所以后面也是有序的。所以只需要将 \(0\sim n-1\) 每个输出 \(n\) 遍即可。

9-25

Non Arithmetic Progression Set

情况

  • 时间:\(1.5h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 构造

思路

我们发现当所有数在三进制下每位都为 \(0,1\) 时,一定满足条件,因为 \(x-y\neq y-z\) 相当于\(x+z\neq2y\),此时 \(2y\) 的每一位只能是 $0,2,由于 \(x,y\) 每一位都为 \(0,1\),只有 \(0+0=0,1+1=2\),故 \(x=y=z\) 不成立时,一定不满足,而 \(S\) 是一个集合,没有重复的数字,故这种构造一定合法。所以只需要满足集合内每一个数每一位都为 \(0,1\) 即可。

但要注意负数和正数的和有一些小问题,改一下就好了。

追忆

情况

  • 时间:\(1h\)
  • 预期:\(10\)
  • 实际:\(35\)

知识点

  • \(\text{bitset}\)

思路

这道题直接处理是 \(O(n^2)\) 的,所以我们想到了分块,然后我就写了 \(n\sqrt n\) 的方法,但使用了 \(\text{bitset}\) 导致超时,其实只需要再调一下快长即可。

9-26

Two Trees

情况

  • 时间:\(2h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 欧拉回路

思路

我们先可以把所有 \(x\) 的值为 \(-1\)\(x\) 变为 \(0\),然后连接 \(j\to x,x\to j\) 的长度为 \(i\) 的边。然后我们检查欧拉回路是否存在,如果不存在,直接输出 IMPOSSIBLE,退出程序即可。然后我们 \(\text{dfs}\),每一个搜索第 \(x\) 个点时,把连接 \(x\) 的第一条边取出,删掉一对边(即 \(x\to y,y\to x\)),递归到连接的点,把递归到的点搜索完后,把边权从该点中删掉,加到递归到的点。最后直接输出即可。

Balanced Reversals

情况

  • 时间:\(2h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 构造

思路

由于 \(n\) 为偶数,每次也是交换偶数次,所以我们可以两两分组,\(00\to1,01\to2,10\to3,11\to4\),所以每次反转,\(1\to1,2\to3,3\to2,4\to4\),所以 \(1\)\(4\) 的数量是不变的,所以如果两个字符串的 \(1\)\(4\) 的数量不相等,直接输出 \(-1\) 即可。然后我们尝试用 \(2\) 步还原一个位置即可做出此题。

9-27

乘法减法按位或

情况

  • 时间:\(1h\)
  • 预期:\(100\)
  • 实际:\(100\)

知识点

  • 贪心

思路

我们可以发现当把数组 \(a\) 排序后,如果 \(i\times j-(a_i|a_j)\) 是最大值,那么 \(|i-j|\) 不会大于 \(300\),所以 \(O(300n)\) 就过了。

三变二

情况

  • 时间:\(2h\)
  • 预期:\(10\)
  • 实际:\(10\)

知识点

  • 贪心

思路

首先我们肯定希望 \(d_i\) 都变为 \(0\),所以我们将 \(l_i\) 变为 \(l_i+\sum_{j=i+1}^nd_j\)\(r_i\) 变为 \(r_i+\sum_{j=i+1}^nd_j\),所以我们考虑计算 \(d_i\) 全为 \(0\) 时如何计算。

我们枚举最终的 \(a_n=x\)\(x\) 可以取所有满足 \(l_i\le a_0\)\(l_i\),以及 \(a_0\) 本身。而 \(b_n\) 的取值为 \(b_0\) 与所有满足 \(l_i<c\)\(r_i\) 中的最小值。

所以这道题我们通过 \(O(n\log n)\) 的复杂度就过了。

礼物交换

情况

  • 时间:\(2h\)
  • 预期:\(0\)
  • 实际:\(0\)

知识点

  • \(\text{dp}\)

思路

我们设 \(f_{i,j}\) 为我们考虑到了第 \(i\) 组,前 \(i\) 组定了 \(j\) 个人必须给自己组投票的方案数,\(l_i\) 为第 \(i\) 组的人数。那么 \(f\) 的转移应为:

\[f_{i,j}=\sum_{k=0}^{min(j,l_i)}f_{i-1,j-k}\cdot g_{i,k} \]

由此我们也可以得到 \(g_{i,j}\) 的转移公式:

\[g_{i,j}=\sum_{k=0}^{min(j,c_i)}g_{i-1,j-k}\frac{1}{(c_i-k)!}(^{len-j+k}_{k}) \]

所以我们得到了答案 \(ans=\sum_{i=0}^nf_{m,i}(-1)^i(m-i)!\)

posted @ 2025-09-24 11:48  小熊涛涛  阅读(25)  评论(0)    收藏  举报