Crysfly的博客

博客

Tags
None

Public Round #15 题解

2025-02-13 19:14:55 By Crysfly

谢罪环节:

这次题目疑似组难了,码量也不太平衡。总之祝大家省选顺利(

最小表示法

来源:

拆成若干次计算 $[f(a_i) = f(a_{i+1})]$。

对于长度为 $n$ 的串,若循环节为 $d$,则 $f(s) = 1\sim d$ 的概率都为 $\frac{1}{d}$。

设 $g(n)$ 为循环节为 $n$、长度为 $n$ 的串个数,可以容斥得到 $g(n) = \sum_{d|n}26^{d}\mu(\frac{n}{d})$。

$P(f(n)=k)$ 可以分为 $d_0(n)$ 个值相等的连续段,对每个连续段算概率即可。

时间复杂度 $O(n d_0(V))$。

注意特判 $n=1$。

二叉搜索树

来源:

首先把询问离线。考虑在链上怎么做:

考虑差分,维护两棵相邻 BST 之间的变化。扫描线,在 $[l,r]$ 加入插入操作,相当于 $l$ 时加入了一个插入操作,$r+1$ 时删除了一个插入操作。

考虑对于一个 $x$,哪些点是 $x$ 的祖先?

对于所有比 $x$ 大的数 $y$,把 $y$ 按照值从小到大排序,一个一个扫,设 $now=t_x$,如果 $t_y < now$ 则 $y$ 记入 $x$ 的祖先,并且 $now \to \min(now,t_y)$。也就是所有使 $now$ 变小的点的权值。

以权值为下标、时间为值建线段树,那上面要求的信息就是套用楼房重建,前缀最大值线段树的做法。

对于比 $x$ 小的 $y$,就是 $y$ 按照值从大到小排序,一个一个扫。于是维护两棵前缀最大值线段树即可。

在树上的做法:

直接树链剖分,对每条链套用链的做法,时间复杂度 $O(q\log^3 n)$,期望得分 72 或 100,被 hos_lyric 卡过去了

既然在链上的做法是差分,那也可以套用到树上做树上差分。发现维护的信息就是在线段树上做,可以做树上差分+线段树合并。时间复杂度 $O(q\log^2 n)$,期望得分 100。

算法 2 by gqh

先发现答案的形式比较简单,只和x<=query的tim后缀最小值有关,x>query同理。

然后离线下来对x排序用吉司机线段树对time去checkmin即可。

虽然是 $q\log n$ 次区间checkmin,但是复杂度仍然是 $O((n+q)\log^2 n)$。

黑白球染色

来源:

相当于有一个直方图,图内的格子必须是 $0$,外面的格子可以是 $0/1$。(这里把 $a_i$ 翻转了,变成 $\le a_i$ 的必须是 $0$)

每个 $0\to 0$ 之间必须 xor 偶数次,$0$ 到末尾 xor 偶数或奇数次都行。

假设对于这每个绿色的区间都求出一个多项式 $f(x)$,$f(x)[x^i]$ 表示在区间内操作了 $i$ 次的方案数。

从下到上做,每个区间就是下面一层子区间一堆多项式乘起来,然后再乘一个变换。

这个变换在多项式上是 $F(x) \to \frac{(F(x+1)+F(x-1))}{2}$。

由于最终答案是最上面那个多项式的 $F(0)$,所以最下面多项式维护点值 $F(-m...m)$,往上一层能求出 $F(-(m-1)..(m-1))$,直到最上面一层能求出 $F(0)$,就行了。

开 $m$ 棵线段树,维护每一层的每个区间的 $F$ 值,以及 $F$ 值的区间乘积。修改一个 $a_i$ 时,只会有 $O(m)$ 个区间的 $F$ 值要重新计算。

时间复杂度 $O(qm^2\log n)$。

另一个做法:https://www.cnblogs.com/275307894a/p/18450179

Public Round #15 公告

2025-02-11 16:41:24 By Crysfly

省选 2025 即将来临,Public Round #15 将在 2025 年 2 月 15 日 ~ 2 月 16 日举行!比赛将进行 4.5 小时,共 3 道题,OI 赛制。

本次模拟赛的题目难度约为省选难度,所有题目都有部分分。

本次模拟赛的组题人 & 搬题人为 Crysfly,验题人为 Galex, gqh, seanlsy, xfrvq, xujindong, qiuzx 等。

比赛链接:https://pjudge.ac/contest/1914

选手可以在以下时间窗口中自由选择 4.5 小时参加(UTC +8):

  • 2025-2-15 08:30:00 - 2025-2-15 13:00:00
  • 2025-2-15 10:00:00 - 2025-2-15 14:30:00
  • 2025-2-15 13:30:00 - 2025-2-15 18:00:00
  • 2025-2-15 19:00:00 - 2025-2-15 23:30:00
  • 2025-2-16 08:30:00 - 2025-2-16 13:00:00

赛后会公开原题链接和题解链接。

特别提醒:本次比赛的题目均为原题,但为了比赛的公平性,请勿在比赛时尝试查找原题地址。如不幸见过原题,请向管理员报告。

粉兔本纪

2025-02-09 21:19:19 By Crysfly

粉兔本纪

陈亮舟者,闽人也,号小粉兔。少机敏,善算学,尝以弱冠之年入国集训队,列第五十有一,保送清华,名震天下。然其行止不羁,轶事遍传,世皆奇之。

少年峥嵘,锋芒初露

亮舟少时,以算法为剑,纵横OI(信息学奥赛)江湖。NOIP初赛,众皆折戟,独舟得九十又五分,冠绝同侪。后战NOI,虽列五十有一,然其志愈坚,誓曰:“吾必马踏常州,手刃劲敌!”终与同分者共入集训队,保送清华,领四载新生之赏,一时风头无两。

清华岁月,跌宕浮沉

及入清华,选人工智能实验班,课业繁重,晨起夜寐。然舟性疏阔,尝挂科二门,普物期末得廿二、卅七,四级试因晨食一包逾时缺考,毕设未竟,遂延卒业。然其勤学不辍,每至深夜,直播课业,虽错谬亦坦然示人。或问其故,答曰:“操……此乃抽代之玄奥也!”

舟好饮康师傅冰红茶,日啖二升,后易为白液(旺仔牛奶),自称“最强奶龙”。尝饮奶漏于裆,遗内裳于逆旅,为世所笑。

赛场纵横,毁誉参半

舟战Codeforces,尝负百四十七、百五十四,又因弊行负二百二十,洛谷公赛弊,名棕。然其志未堕,战CCSP得铜首,复言:“吾必马踏哈尔科夫,手刃优姆尼克!”世或讥其狂,或叹其勇。

阿赛一役,舟列三百五十七,败于涟水中专生,得号“败姜”。或戏曰:“涟氵与清华同源,舟败非战之罪,乃天命也!”

性情轶事,世所罕闻

舟好白丝女仆之服,尝于NOI之际出柜,裸照遍传网络。直播时遇弹幕指谬,或沉思良久,终叹曰:“此乃新错法,诸君慎之!”

其行率真,尝于图书馆观美人,不慎被困;又于自习室疑电脑失窃,实为旁人挪移。或问择偶之标,答曰:“操我要洗澡!”闻者绝倒。

太史公曰: 亮舟者,奇才也。其算法之精,可比项王扛鼎之力;其行事之诡,犹若鸿门宴之变。然刚愎疏狂,若项羽失韩信;挂科延毕,似霸王弃关中。然观其直播课业、答疑后进,亦存赤子之心。嗟乎!世之奇才,多毁誉参半。若舟能敛锋芒、修内省,则传奇宗师之业,可期矣。

赞曰:

算法为剑破长空,冰茶作酒笑疏狂。

裸照女装皆轶史,败姜挂科亦传章。

直播夜深星月黯,答疑年少意气昂。

若问传奇何日就?且看粉兔踏沧浪。

(注:文中轶事多引自洛谷、知乎诸帖,虚实杂糅,聊博一哂。)

Public CT* Round #2 Day 1 题解

2024-11-26 10:54:17 By Crysfly

赤橙黄绿

青与兰

考虑画一个十字形,把第 $1,3$ 象限和第 $2,4$ 象限分别匹配,红点是 $(0,0)$,如果蓝点和黄点的数量匹配就匹配成功。

如果确定了十字形的角度,那么两条分割线的位置是确定的(必须把点分成两半),因此可以 check 一个角度是不是可行的。

这样分点之后,第一象限点数 = 第三象限点数,第二象限点数 = 第四象限点数。

设差值 $c$ 为 第一象限蓝点数 - 第三象限黄点数。则 $-c$ 为 第二象限蓝点数 - 第四象限黄点数。

若 $c=0$ 则找到了能匹配成功的角度。

考虑角度从 $\alpha = 0$ 转到 $\alpha = \frac{\pi}{2}$,那差值会从 $c$ 变到 $-c$,并且在转动过程中每次只会 $\pm 1$,一定有一个角度差值为 $0$。

二分求这个角度即可。具体的,假设 $c_l > 0, c_r < 0$,我们求出 $c_{mid}$,不断取 $c_l \times c_r < 0$ 的区间。

算 $c_{\alpha}$ 需要排序,时间复杂度 $O(n\log n\log V)$。(也可以 nth_element,$O(n\log V)$)

黑与紫

鸽了,可以看 https://qoj.ac/blog/bulijiojiodibuliduo/blog/994

Public NOIP Round #8 题解

2024-11-26 10:25:45 By Crysfly
  • 组题人 & 搬题人:znstz, Crysfly

位集

来源:

最后 bitset 中为 $1$ 的点 $j$ 是在 $i \in [l,r]$ 中 $s_{i,j}$ 全为 $0$ / 全为 $1$ 的。

设 $len_{i,j}$ 表示从 $(i,j)$ 开始往右,相同的的最大长度。这个可以直接递推得出。

将每个 $i$ 的所有 $len_{i,j}$ 排序,查询时二分即可。

偷塔

来源:

$X_{max} - X_{min}$ 可以看作,选出 $k$ 个点后,在点集中任意选出一个点贡献 $+X$,再任意选一个点贡献 $-X$,得到的最大值。$Y_{max} - Y_{min}$ 也同理。

于是设 $f_{i,j,s}$ 表示前 $i$ 个点中,选了 $j$ 个点,$+X/-X/+Y/-Y$ 有哪些已经选择并产生贡献(状压为 $s$)。可以得到 $O(nk)$ 的做法。

进一步的,考虑贪心:若 $k\ge 5$,容易发现 $c$ 最大的点一定被选。如果不选 $c$ 最大的点,剩下 $5$ 个点中一定存在不对 $+X/-X/+Y/-Y$ 产生贡献的点,可以调整到 $c$ 更大。

这样就把问题降为了 $k\le 4$,DP 部分的复杂度降为 $O(n)$,只需要对 $c$ 排序。时间复杂度 $O(n\log n)$。

降雨

来源:

对于最终方案,积水的总体积为:

$$\sum_{k=1}^n\min\{\max_{1\le j\le k}h_j,\max_{k\le j\le n}h_k\}-h_k$$

注意到只与前缀、后缀最大值有关,因此可以 DP:

设 $f_{i,j,p,s,0/1}$ 表示前缀 $i$ 个格子中,选了 $j$ 个抹平,此时前缀最大高度为 $p$,后缀最大高度为 $s$,积水数量 $\bmod 2$ 为 $0/1$。

观察到 $p,s$ 都只有至多 $k+1$ 种取值,状态数为 $O(nk^3)$,转移为 $O(1)$。

考虑优化:注意到,最终最高的格子一定不会贡献任何积水,但是最高的格子可以当作边界来用。

假设枚举了最终最高的格子 $i$,那只需要前缀/后缀分别 DP,在这个位置合并即可。

那么状态降为 $f_{i,j,p,0/1}$(不需要记录后缀最大高度),时间复杂度 $O(nk^2)$。

矩阵

来源:

Public NOIP Round #8 公告

2024-11-20 23:09:42 By Crysfly

Public NOIP Round #8 将在 2024 年 11 月 23 日 - 2024 年 11 月 24 日 举行!

本次比赛只有提高组,进行 4.5 小时,有 4 道题,OI 赛制。题目难度约为 noip,所有题目都有部分分。

选手可以在以下时间窗口中自由选择 4.5 小时参加(UTC +8):

  • 2024-11-23 08:30:00 - 2024-11-23 13:00:00
  • 2024-11-23 10:00:00 - 2024-11-23 14:30:00
  • 2024-11-23 13:30:00 - 2024-11-23 18:00:00
  • 2024-11-23 19:00:00 - 2024-11-23 23:30:00
  • 2024-11-24 08:30:00 - 2024-11-24 13:00:00
  • 2024-11-24 10:00:00 - 2024-11-24 14:30:00
  • 2024-11-24 13:30:00 - 2024-11-24 18:00:00

本次比赛的组题人为 Crysfly, znstz,搬题人为 Crysfly, znstz,验题人为 gqh, qiuzx, pp_orange

赛后会公开原题链接和题解链接。

特别提醒:本次比赛的题目均为原题,但为了比赛的公平性,请勿在比赛时尝试查找原题地址。如不幸见过原题,请向管理员报告。

Public NOIP Round #7 题解

2024-10-21 23:23:46 By Crysfly
  • 组题人:znstz, Crysfly

填写数字

来源:

排列计数

来源:

黑白棋子

来源:

不妨假设 $w\ge b$。

记 $mx_i$ 为删去 $i$ 之后剩下的连通块的大小最大值,那么假如 $w>mx_i$,则 $i$ 任意时刻必须是白色。

考虑当有点必须是白色时,答案就是把这些必须是白色的点删去后,剩下的大小超过 $b$ 的连通块个数。

否则,答案是 $1$ 或 $2$,而且为 $1$ 当且仅当存在某个点 $u$,删去 $u$ 之后存在两个连通块大小超过 $w$ 且存在另一个连通块大小超过 $b$。

我们记 $m=\min\{mx_i\}$,显然这个式子在重心处取到最小,所以我们以重心为根(有两个的时候就以那条边为根)。

当 $w\le m$ 时,没有点必须是白色,割掉一个点后最大的连通块一定是父亲的那个,所以记 $se_i$ 为儿子子树中的次大值,那么当 $b\le \max\{se_i\}$,答案是 $1$,否则答案是 $2$。

当 $w>m$ 时,必须是白色点的那些点形成了一个包含根的连通块,那么我们知道删去白色的点之后剩下的连通块一定是某个子树,那么一个子树是剩下来的连通块的条件就是 $mx_{fa_i}< w\le mx_i$,然后会所有 $b\le \min(w,sz_i)$ 有 $1$ 的贡献。

复杂度 $O(n)$。

冒泡排序

来源:

考虑枚举一个值 $V$,将序列中 $\ge V$ 的值看作 $1$,$< V$ 的值看作 $0$,将序列变成 $01$ 的形式。

对于所有的 $V$,求出对 $01$ 序列做完后区间内 $1$ 的个数,把这些答案相加就是总和。

发现对于一段后缀,它的每个 $0$ 每轮会向前移一格。一段前缀,如果有 $1$ 的话,一定会有 $1$ 交换到交界处。

那么对于一个值 $V$,我们询问的后缀 $[p,r]$ 新增的 $1$ 的个数其实是 $[p,p+k-1]$ 中的 $0$ 数与 $[l,p-1]$ 中的 $1$ 数取 $\text{min}$。

把暴力写出来,发现 $\text{min}$ 两边的贡献都是简单的主席树查询,取 $\text{min}$ 的情况也是简单的主席树二分,直接维护就好了。

时间复杂度 $O(n \log n)$。

Public NOIP Round #7 公告

2024-10-16 22:43:25 By Crysfly

Public NOIP Round #7 将在 2024 年 10 月 19 日 8:30 - 2024 年 10 月 20 日 18:00 举行!

本次比赛只有提高组,进行 4 小时,有 4 道题,OI 赛制。题目难度约为 noip,所有题目都有部分分。

选手可以在以下时间窗口中自由选择 4 小时参加(UTC +8):

  • 2024-10-19 08:30:00 - 2024-10-19 12:30:00
  • 2024-10-19 10:00:00 - 2024-10-19 14:00:00
  • 2024-10-19 14:00:00 - 2024-10-19 18:00:00
  • 2024-10-19 19:00:00 - 2024-10-19 23:00:00
  • 2024-10-20 08:30:00 - 2024-10-20 12:30:00
  • 2024-10-20 10:00:00 - 2024-10-20 14:00:00
  • 2024-10-20 14:00:00 - 2024-10-20 18:00:00

如果已经报名的选手想要修改比赛时间,可以在此处取消报名。

本次比赛的组题人为 Crysfly, znstz,搬题人为 Crysfly, znstz,验题人为 gqh, qiuzx, pp_orange

赛后会公开原题链接和题解链接。

特别提醒:本次比赛的题目均为原题,但为了比赛的公平性,请勿在比赛时尝试查找原题地址。如不幸见过原题,请向管理员报告。

Public Round #13 题解

2024-06-30 13:52:50 By Crysfly
  • 搬题人
    • 旋转序列:p_b_p_b
    • 交换豆子:Crysfly
    • 序列计数:Lynkcat
  • 组题人
    • Lynkcat
  • 题解:Crysfly

旋转序列

来源:

两个串之间 $1$ 匹配的次数总和为 $k\times l$,并且共有 $n$ 次匹配。

于是答案的上界为 $k\times l$ 个球放进 $n$ 个盒子,最小化最大的盒子中的 $1$ 个数,也就是 $\lceil \dfrac{k\times l}{n} \rceil$。

设 $ans = \lceil \dfrac{k\times l}{n} \rceil$,我们可以构造来达到这个上界:

  • 对于第一个串,将前 $k$ 个位置变成 $1$。
  • 对于第二个串,设这个串的前缀和数组为 $sum_i$。设 $sum_i = \min(\lfloor\dfrac{(i+1)\times ans}{k} \rfloor,l)$,然后差分即可。

交换豆子

来源:

假设 C1P0

枚举第一行最后有多少个 $1$,由于 $1$ 的总个数不变,因此第一/第二行的 $1$ 的个数是确定的。

假设 $y$ 坐标为 $[1,2]$,$x$ 坐标为 $[1,n]$,此时我们想要最小化 移动步数 + 最后所有 $1$ 的 $x$ 坐标之和,答案就是这个值减去 $c_1(c_1+1)/2+c_2(c_2+1)/2$。

上下的移动步数是确定的,只需要最小化向右的移动步数(这些移动步数会增加 $x$ 坐标,每移动一步会有 $2$ 的代价,因为要增大 $x$ 坐标且多移动一次)。

接下来观察一些性质:

  • 把一个 $1$ 从上往下调一定不优。
  • 我们可以考虑先做若干次向右移动,直到某个时刻上下调整可以使得上下的个数满足要求,然后再上下调整。

什么情况下可以满足要求?若一列有 $2$ 个 $1$,则这列必须在第二行有一个 $1$,也就是有 $2$ 个 $1$ 的列不能超过 $c_2$ 个。

对于一个前缀的若干列,设有 $sum_i$ 个 $1$ 和 $i$ 列,则有 $\max(0,sum_i-i-c_2)$ 个 $1$ 必须向右调,需要花费的代价就是 $\sum 2\times \max(0,sum_i-i-c_2)$。

对于每种 $(c_1,c_2)$ 维护一个 $ans_{c_2}$,交换同一列两个时 $sum_i$ 不改变;交换不同列时只有 $1$ 个 $sum_i$ 会改变至多 $1$,只需要在 $ans$ 上区间加。

用线段树维护 $ans$ 数组,时间复杂度 $O(n+q\log n)$。

序列计数

来源:

考虑转化成一个格路计数问题:

  • 有一个 $n\times m$ 的网格,每次可以往上或往右走,要从 $(0,0)$ 走到 $(n,m)$。
  • 每次从 $(i,j)\to (i+1,j)$ 就确定了 $a_{i+1}=j$,称 $(i,j)\to (i+1,j)$ 为横线。
  • 对于求 $\{a_i-i\}$,可以转化成:画出 $y=x+k(-(n-1)\le k \le m)$ 的所有斜线,对于每条斜线,若有 $c$ 个横线在它的上方经过,则将 $ans_{n-c+1}\dots ans_n$ 加上 $1$。

考虑对于每条斜线算贡献,我们想要对于每个 $c$ 算出,有多少个方案恰有 $c$ 个横线在它的上方经过。

先特判掉所有没有触碰这条斜线的情况,这部分贡献可以 $O(n)$ 算出。

枚举这条斜线上的两个位置,钦定这是走的路径第一次、最后一次触碰斜线的位置。

我们有结论:

  • 在一个 $n\times n$ 的网格中从 $(0,0)$ 走到 $(n,n)$,设所有 $(i,j)\to (i+1,j)$ 在对角线上方经过的次数为 $c$ 的方案数是 $ans_c$,则所有 $ans_c$ 相等,均为 $\frac{\binom{2n}{n}}{n+1}$。

于是钦定第一次、最后一次的触碰位置后,可贡献的 $c$ 是一个区间,且对于区间中的每个 $c$ 贡献相等。于是只需要在差分数组上修改。

直接枚举算贡献的复杂度是 $O(n^3)$ 的,考虑如何优化。

把 $y=x+k$ 的直线分成 $k\in [0,m-n]$ 和 $k\in [-(n-1),-1]$ 两部分。$[m-n+1,m]$ 和 $[-(n-1),-1]$ 是对称的。


考虑 $k\in [m-n+1,m]$ 的部分。

假设我们确定了触碰始终点之间的长度 $len$,则在差分数组上的修改位置是确定的。

枚举 $len$,那这段触碰始终点之间的方案是固定的 $\frac{\binom{2len}{len}}{len+1}$,前后两段的形式都是 $(0,0)\to (a,b)$ 且不触碰 $y=x+(b+1-a)$ 的折线个数(假设把后面一段对称一下)。

把这两段折线拼起来,就变成了一段折线,形式也是 $(0,0)\to (a,b)$ 不触碰 $y=x+(b+1-a)$,且 $a,b$ 只和 $len$ 有关。这样前后的方案数就变成了两个组合数相减的形式。

再枚举所有的 $k$ 加起来,发现加减的项抵消了,可以 $O(1)$ 计算同一个 $len$ 的方案数。于是这部分能做到 $O(n)$。


考虑 $k\in [0,m-n]$ 的部分。

由于我们是在差分数组上修改,我们可以只关心:对于所有触碰起点/终点,其方案数之和。起点和终点是相似的,下面只考虑起点。

由于起终点之间的方案数就是 $\frac{\binom{2len}{len}}{len+1}$ 的形式,我们钦定这部分全部在斜线上面走。那折线就变成了 $(0,0)$ 到起点且只在起点触碰斜线 乘上 起点到 $(n,n)$ 并且不穿过斜线。

这样也是两个 $(0,0)\to (a,b)$ 不触碰 $y=x+(b+1-a)$ 的形式,可以把两段折线拼起来,贡献是两个组合数相减。

再枚举所有的 $k$ 加起来,发现是要求若干个如下的形式:

$$\sum_{k=0}^{m-n}\binom{2p+k}{p}\binom{n+m-k-2p}{n-p}$$

观察一下,发现上面加起来是常数,下面加起来也是常数。把这个看作要求 $\sum_{i=l}^{r} \binom{i}{k}\binom{n-i}{m-k}$。

先差分成求 $\sum_{i=0}^{r} \binom{i}{k}\binom{n-i}{m-k}$。若移动起点 $p\to p+1$,则 $n,m$ 不会修改,$r,k$ 有 $O(1)$ 的变化量,则这个式子可以 $O(1)$ 维护:

  • 增大 $r$ 显然只需要加上一项。
  • 增大 $k$ 的话,考虑这个式子的组合意义是“在 $n$ 个白球中染黑 $m$ 个,且第 $k$ 个黑球的位置 $\le r$”。若 $k\to k+1$,则限制变成“第 $k+1$ 个黑球的位置 $\le r$”,需要减去第 $k+1$ 个黑球位置 $> r$ 的情况。

于是这部分也能做到 $O(n)$。

鱼跃龙门

2024-05-28 18:00:01 By Crysfly
共 12 篇博客
  • 1
  • 2