HDU多校

posted on 2025-07-22 13:03:38 | under | source

2025“钉耙编程”中国大学生算法设计暑期联赛(2)

前言

非常欢乐(痛苦)的 HDU 多校,基本每一场赛后都看懂了题解,但是没时间(懒)去写博客了,所以内容非常残缺,看个乐子吧。

概况

队长 larsr,队员我、lsy、sst、yfz。

多校 2

开题!成功分配到了 C、D 两坨大的,想了一会感觉会 C 了,结果败在了比大小上。给队伍贡献 6 发罚时!

大家只通过了签到题,共过 5 题!打成屎了。

B、F、H、I、L

签到题,没啥好说的。

A 骰子

分圆多项式。

C 图上的数

link

就差一点呜呜呜。

\(m\) 为路径的边数,\(\sum p\) 为边权,那么期望 \(\frac {2^m-1}m\sum p\),要最大化这个东西。

只考虑边权和为正。注意到前半部分增长很快,意味着只需考虑最大边数 \(mx\) 往前 \(50\) 个。那么跑拓扑排序时,对于一个点为结尾的所有路径,保留正边权和的最大的 \(50\) 个,以及边数最多的边权为 \(0\) 的路径即可。

问题来到比大小!看作判断 \((2^a-1)b<(2^x-1)y\)

化式子:

\[2^ab-b-2^xy+y<0 \]

不妨令 \(a\ge x\)

\[2^x(2^{a-x}b-y)<b-y \]

右边至多 \(10^{14}\)。这个形式就比较好判断了,做巨大分讨即可。

所以不要相信 AI,还是自己推吧。

D 子串的故事(2)(不会)

E 循环位移

link

值得注意的是,\(x\) 应为偶数否则无法改变逆序对奇偶性。

一次操作会使得开头元素右移 \(x-1\) 位,其他元素左移一位。那么对于最大值,可以将其不断右移 \(x-1\) 位,最后若位置不够了就左移再右移。按照这个方法,可以使得前 \(n-x+1\) 大的元素归位。对于第 \(i\) 大的元素,期望操作次数为 \(\frac 12\sum\limits_{i\in [x,n]} (\frac ix+x)\)

对于剩下 \(x-1\) 个元素,先探究如何只交换开头两个元素,经过打表发现:先以 \(2\) 为开头操作一次,然后依次以 \(2,1\) 为开头操作共 \(x\) 次。

证明:\(2\) 先被移到 \(x+1\),然后吃满每个操作被移到 \(1\)\(1\) 除开始两个操作都吃满被移到 \(2\)\(3\dots x+1\) 中的奇数会被移动 \(x\) 次且不经过 \(1\),最终不变;偶数同理。

那么交换 \(1,i\) 就很容易了,让 \(i\) 移到 \(2\) 然后做上述操作,再将 \(1\) 复位到 \(i\) 即可。期望 \(\frac 12(x-2)(2x+1)\)

差不多取 \(x\)\(\sqrt n\) 可过。

所以有的时候要耐心打表观察。

G 计数

link

考虑朴素 dp,记 \(F_i(x)\) 为考虑 \(i\dots n\)\(b_i=x\) 的方案。转移显然:

\[F_i(x)=\sum\limits_{a_{i+1}\le j\le x} F_{i+1}(j) \]

这相当于滚了一遍前缀和,归纳得 \(F_i\)\(n-i\) 次多项式。

套路:二项式系数基。将多项式记为如下形式,其中 \(c_{i,k}\) 是系数:

\[F_i(x)=\sum\limits_{0\le k\le n-i} c_{i,k}{x\choose k} \]

推式子:

\[F_i(x)=\sum\limits_{a_{i+1}\le j\le x}\sum\limits_{0\le k\le n-i-1} c_{i+1,k}{j\choose k} \]

交换求和顺序以便使用朱世杰恒等式:

\[=\sum\limits_{0\le k\le n-i-1} c_{i+1,k}\sum\limits_{a_{i+1}\le j\le x}{j\choose k} \]

\[=\sum\limits_{0\le k\le n-i-1} c_{i+1,k}({{x+1}\choose {k+1}}-{{a_{i+1}}\choose {k+1}}) \]

\(x+1\) 拆掉:

\[=\sum\limits_{0\le k\le n-i-1} c_{i+1,k}({{x}\choose {k+1}}+{{x}\choose k}-{{a_{i+1}}\choose {k+1}}) \]

然后分别向 \(k,k+1\) 项贡献即可,后面这个东西可以看作向 \(0\) 项贡献。大力维护就是 \(O(n^2)\)

赛时一眼认出划艇,然后走上了一条不归路,所以不要过度联想以前见过的题,而忽略了新的想法。

“二项式系数基”的套路可以记下来。

多校 7

战况:8 题,rk21,最高的一次。1001 差点不会。1007 花最后 1h 写结果太困了犯下弱智错误,没过。1012 想的做法过于复杂了,不想写。这次太困了全程随机开题。

多校 8

战况

9 题,rk35。这场出的一坨,放暴力过、快结束了改数据范围、还有题解瞎讲。

过了 1006(F),然后帮 sst 想了 E、J 做法。后面在想 1012。

忽略掉一些比较简单的题。

1012 最多变的序列

link

题意:给你排列,可以进行任意次将区间元素替换为区间最小值,求最终序列可能情况数。\(n\le 3\times 10^3\)

这很 atcoder。考虑找充要条件,显然有所有值为 \(x\) 对应的下标构成一个连续段,并且是原来 \(x\) 的极大管辖区间的子区间(满足区间元素都 \(>x\))。然后发现对于 \(a_x<a_y\),最终 \(a_x\)\(a_y\) 对应的连续段的相对位置不能变,也就是说去重后是原来的子序列。

貌似够了,不难构造方案证明其充分性。然后直接 dp 即可,\(O(n^2)\)

启示:一时半会看不出充要条件,要耐心找必要条件逐渐缩小范围。不能随便套用之前题面的做法,就是因为这个想了很久区间 dp。

1004 最糖的题目

link

题意:给你序列 \(a,b\)\(k\),求能否对两个序列进行任意次对 \(k\) 长度的子区间进行循环位移,使得 \(a,b\) 相同。

首先特判掉 \(k=1,k=n\) 的情况,同时元素出现次数必须相同。

根据之前一场有个叫循环位移的题,当 \(k\) 为偶数时必然有解。

然后考虑 \(k\) 为奇数,先考虑排列,此时不能更改序列逆序对奇偶性,大胆猜测充要条件为逆序对奇偶性相同。实际上也能构造证明。不为排列相当于可对相同元素任意标号,可随意改变奇偶性使其合法。

关于证明,首先套用循坏位移做法,可将元素依次归位直到剩下 \(k-1\) 个元素。题解说当 \(>2\) 个元素也能归位,根据群友说法,有办法将前三个数循环位移,应该对。

1002 不最近的路

link

题意:记路径权值为其前 \(k\) 大边权之和(可能没有 \(k\) 条),求次短路。

\(k\) 大之和难以通过状态转移描述,但边数不多,考虑枚举第 \(k\) 大边权 \(=p\)。问题变成怎么只算入第 \(k\) 大边权恰为 \(p\) 呢?

下一步非常巧妙:令所有边 \(w\gets \max(0,w-p)\),跑最短路,最后再 \(+kp\)。这基于一个思想:放宽限制。但确保每种路径在其第 \(k\) 大边权时被正确算入,其它情况答案偏大。记 \(q\) 为路径实际第 \(k\) 大边权,证明如下:

  • \(q=p\):正确。
  • \(q<p\):此时其 \(<p\) 的若干前 \(k\) 大边权会算错,被算大为 \(p\)
  • \(q>p\):此时其 \(\ge p\) 的非前 \(k\) 大边权会被错误地算入,也是偏大。

那么跑 \(m\) 次最短路即可。

多校 10

战况

终 局 之 战。6 题罚时拉满,rk11,曼巴差一点调出 1008。自己做了 1007、1012.

1001 Submission

link

转化一下,看成一个优先队列,每次不删去队尾而是只看队头 \(k\) 个元素。那么容易发现,一个人在队列里的出现时间必然是一段区间(先插入、然后逐步被挤走)。

注意细节:每一轮先插入计算答案、再删去。所以一个人的贡献即为出现次数减去区间内他的出现次数,那么不妨令区间右端点为这个人的位置,而左端点又必为他第一次出现的位置,所以区间个数 \(O(n)\)

考虑算答案,从区间的角度出发,判断合法性。那么发现必要条件是每个间隔(而非点)被区间覆盖的次数 \(\le k\)。也易证明充分性,考虑让对区间连边来刻画优先级大小,那么只可能左往右连,于是是 DAG 有方案。

然后要让区间代价(区间内元素个数)最大化,这是经典费用流问题。等价于可以将区间分为 \(\le k\) 组,每组的区间不交。而相同左端点区间只能选一个可用虚点刻画。

最后要对每个 \(k\) 求答案,将 \(i\to i+1\) 的边容量设为 \(m\),每次走一条增广路即可。\(O(n^2\log n)\)。可桶排去掉 \(\log\)

posted @ 2026-01-13 12:10  Zwi  阅读(3)  评论(0)    收藏  举报