Crysfly的博客

博客

Tags
None

Public Round #15 题解

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

谢罪环节:

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

最小表示法

来源:

拆成若干次计算 [f(ai)=f(ai+1)]

对于长度为 n 的串,若循环节为 d,则 f(s)=1d 的概率都为 1d

g(n) 为循环节为 n、长度为 n 的串个数,可以容斥得到 g(n)=d|n26dμ(nd)

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

时间复杂度 O(nd0(V))

注意特判 n=1

二叉搜索树

来源:

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

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

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

对于所有比 x 大的数 y,把 y 按照值从小到大排序,一个一个扫,设 now=tx,如果 ty<nowy 记入 x 的祖先,并且 nowmin。也就是所有使 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🌈

位集

来源:

最后 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 20/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🌈

填写数字

来源:

排列计数

来源:

黑白棋子

来源:

不妨假设 w\ge b

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

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

否则,答案是 12,而且为 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🌈

旋转序列

来源:

两个串之间 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],此时我们想要最小化 移动步数 + 最后所有 1x 坐标之和,答案就是这个值减去 c_1(c_1+1)/2+c_2(c_2+1)/2

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

接下来观察一些性质:

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

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

对于一个前缀的若干列,设有 sum_i1i 列,则有 \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 不改变;交换不同列时只有 1sum_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,kO(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