NOI2025 赛前做题记录 - 5 月
五月份不能再这么闲了。
- 校内训练
- 梦熊苍穹计划
- 核桃编程 NOI 组周赛
- 信友队
- APIO 2025
- 正睿
- ARC
- 梦熊周赛
- Universal Cups
- The 2nd Universal Cup. Stage 2: Binjiang
- The 2nd Universal Cup. Stage 9: Qinhuangdao
- The 2nd Universal Cup. Stage 11: Nanjing
- The 2nd Universal Cup. Stage 20: Ōokayama
- A. Numerous Elimination
- B. Almost Large
- C. Yet Another Simple Math Problem
- D. Spacecraft
- E. R-Connected Components
- F. \(N^a(\log N)^b\)
- G. Cola
- H. 404 Chotto Found
- I. T Tile Placement Counting
- J. Set Construction
- K. Dense Planting
- L. Next TTPC 3
- M. Sum is Integer
- N. Bracket Sequestion
- O. 2D Parentheses
- P. Bridge Elimination
- 云斗
- JOISC
- 杂题
- QOJ4894 学姐买瓜
- CF348D Turtles
- AGC041F Histogram Rooks
- CF1781G Diverse Coloring
- P6803 星际迷航
- CF1767F Two Subtrees
- CF1408H Rainbow Triples
- CF1712F Triamater
- Hackerrank Triomino Tiling
- QOJ6355 5
- CF1924E Paper Cutting Again
- Gym103428C Assign or Multiply
- LCS0 - Longest Common Subsequence
- [THUPC 2025 决赛] 一个 01 串,n 次三目运算符,最后值为 1(加强版)
- QOJ6354 4
校内训练
P4729 积木游戏
使用线段树可以简单维护掉落后的高度以及中间的洞的数量,两侧的洞的数量分讨计算一下就好了,由于单调性可以用队列维护,复杂度 \(\mathcal{O}(n\log n)\)。
[USACO24JAN] Island Vacation P
直接在圆方树上 dp 即可,想清楚后再写会简单很多,时间复杂度 \(\mathcal{O}(n^2)\) 甚至 \(\mathcal{O}(n\log^2n)\)。
[USACO21FEB] Minimizing Edges P
考虑两张图等价当且仅当对于所有 \(i\),\((\mathit{dis}_{0,i},\mathit{dis}_{1,i})\) 构成的无序对相同,其中 \(\mathit{dis}_{*,i}\) 表示从 \(1\) 到 \(i\) 与 \(*\) 关于 \(2\) 同余的最短路,不存在的情况可以特判。
那么,将 \((|dis_{0,i}-dis_{1,i}|,dis_{0,i}+dis_{1,i})\) 画在平面直角坐标系上,考虑松弛的过程,那么条件相当于每个点都向下有连边或者同时向左向右有连边(如果 \(|dis_{0,i}-dis_{1,i}|=1\) 那么这个点的左边对应的点和自己的坐标相同),时间复杂度可以做到 \(\mathcal{O}(n+m)\)。
[USACO21FEB] Counting Graphs P
很厉害的计数题!做了一个下午。类似上一题,我们分层并分段 dp,每次算出当前段的答案后乘起来,那么我们从右到左 dp,记录 \(f_{i,j}\) 表示现在考虑了最右边的 \(i\) 个点,其中最后一个点被允许向左连边的点有 \(j\) 个(整体思路是一个容斥,钦定一部分点不让向下连并且不能同时向左右连,这样的点如果被向右连了那么就不被允许向左连),转移时枚举上一层的 \(j\) 和新的 \(j\) 即可,系数可以 \(\mathcal{O}(1)\) 计算,注意边界情况(最左侧 / 源点),总复杂度 \(\mathcal{O}(n^2)\)。
[USACO24DEC] Maximize Minimum Difference P
\(n\) 为偶数是平凡的,否则我们枚举 \(m=\left\lfloor\dfrac{n}{2}\right\rfloor\) 的位置且假设左侧(如果存在的话)为 \(0\) 且右侧(如果存在的话)为 \(n-1\),再根据 \(m\) 的位置分奇偶讨论即可,剩下的太狗屎了懒得写了,复杂度 \(\mathcal{O}(Tn^2\log n)\),可以去掉 \(\log\) 但是更狗屎了。
代码一大坨。
梦熊苍穹计划
梦熊 NOI 模拟赛 #3
梦熊 NOI 模拟赛 #3 C. grid
LGV 板子题,但是 \(V\) 很大,题目转换后如下:
有一个 \(n\times m\) 的矩阵,其中每个数都是不超过 \(V\) 的正整数,并且每个数要大于等于它左边和上面的数,求方案数。
注意到对于如上问题,执行 swap(n, V), --n, ++V 后答案不变!就做完了。
梦熊 NOI 模拟赛 #15
梦熊 NOI 模拟赛 #15 A. 王国
考虑类似点减边容斥的方法,那么我们要求的就是树链上长度为 \(m\) 的相等子串的个数,使用类似 Upside Down 一题的做法,分别考虑跨过 LCA 和没有跨过 LCA 的情况。
没有跨过 LCA 时,可以用主席树和树上差分简单维护,否则可以倍增跳父亲,容易做到 \(\mathcal{O}(n\log n)\)。
梦熊 NOI 模拟赛 #15 B. 迷宫
咕。
梦熊 NOI 模拟赛 #15 C. 细菌 / [PA 2022] Bakterie
咕。
梦熊 NOI 模拟赛 #17
第一题看完大概会做了,假了一次(误用随机权值线性基维护),然后调了一会就过了,这个时候过去了一个半小时。
然后第三题也有思路了,先写个 45 的暴力然后逐步替换,写 + 调了一个半小时,然后半个小时加上 SA 优化,65 分好像。再花 10 分钟加个单侧递归线段树就过了,此时还剩 80min。
看完第二题发现自己做过类似的,然后半个小时就过了。
梦熊 NOI 模拟赛 #17 A. count
根据费马二平方数定理,一个数是好的当且仅当它的每一个 \(4k+3\) 型质因数在唯一分解形式中的重数均为偶数。
将除了这些质数以外的因子排除掉后,那么就是要求它们的乘积为完全平方数,如果将每个数的质因子分解看作是一个向量,那么就是相当于要选择若干个数使得它们的异或和为 \(0\),也就是说我们只需要求出线性基的大小即可。
而一个数至多只有一个大于 \(\sqrt{V}\) 的质因子,对这个质因子特殊考虑后使用 bitset 维护时间戳线性基维护小的质因子即可,复杂度 \(\mathcal{O}\left(V+n\log V+\dfrac{nC^2}{w}+nC\log n\right)\)。
梦熊 NOI 模拟赛 #17 B. grid
如果 \(k\) 是奇数那么暴力模拟一轮,否则可以将 \(k\) 除以 \(2\),然后将每个格子按照 \((x\bmod2,y\bmod2)\) 划分成的等价类递归计算,这个算法流程显然是正确的,记忆化后就能通过了。
梦熊 NOI 模拟赛 #17 C. brackets
先将括号树建出来然后考虑每个节点的所有子节点,那么相当于给定若干个字符串(字符集大小是 \(\mathcal{O}(n)\) 级别的),每种字母有一个相同的权值,要求所有本质不同子串对应的所有字母权值最大值之和,可以使用 SA + lcp 后加加减减拆成 \(\mathcal{O}(n)\) 个 \(\sum\limits_{j=l}^{r}\max\limits_{k=i}^{j}\mathit{val}_k\) 的查询,这可以使用单侧递归线段树轻松解决,复杂度 \(\mathcal{O}(n\log^2n)\)。
梦熊 NOI 模拟赛 #18
比较简单,懒得写比赛过程了。
梦熊 NOI 模拟赛 #18 A. 糖果
断环成链后,对于每个右端点,符合条件的左端点相当于 ban 掉若干个区间后剩余的位置,而扫描右端点的时候区间的增减是 \(\mathcal{O}(1)\) 的,线段树维护即可做到 \(\mathcal{O}(n\log n)\)。
梦熊 NOI 模拟赛 #18 B. 礼物
注意到可以将 \(n\) 对 \(28\) 取 \(\min\),然后折半就好了,复杂度 \(\mathcal{O}\left(3^{\frac{n}{2}}\right)\)。
梦熊 NOI 模拟赛 #18 C. 匹配
经典套路是积和式随机边权转行列式,具体而言假设一条边的边权是 \(e\),它相邻的两条边分别是 \(e_1\) 和 \(e_2\),随机的权值是 \(v\),那么给它赋上 \(v(x^{\{e\}}+x^{\{e_1\}}y+x^{\{e_2\}}y)\) 的边权后求矩阵的行列式即可,具体可以对 \(x\) FWT 完求行列式再 IFWT 回去,复杂度 \(\mathcal{O}(2^kn^3)\)。
梦熊 NOI 模拟赛 #19
在 APIO 期间打的,没认真打。
梦熊 NOI 模拟赛 #19 A. 蛤蟆
直接长剖树上差分做一下就好了,为了方便可以把 \(a_0\) 调整为 \(0\),复杂度 \(\mathcal{O}(n)\)。
梦熊 NOI 模拟赛 #19 B. 矩阵
把这看作是一个 \(3\) 个点的图的邻接矩阵,那么考虑在每张图中选择了哪条边,最后再拼起来,考虑拼起来的系数是多少,发现这等价于一个经过 \(1\) 号节点的欧拉回路数量,根据 BEST 定理,可以在 dp 的时候记录每个点的入度和出度和已经选了生成树上的哪些边,时间复杂度 \(\mathcal{O}(n^5)\)。
梦熊 NOI 模拟赛 #19 C. 贪心
咕。
梦熊 NOI 模拟赛 #20
开场写了个乱搞过了 A,发现 B 随便做做就好了,但是好难写,想了半个小时会了 C。
然后花了一个多小时把 B 写完了,C 调了好久,最后半个小时发现一个细节写挂了,赛后补了 A 正解。
梦熊 NOI 模拟赛 #20 A. 数点
整体二分后莫比乌斯反演即可,复杂度 \(\mathcal{O}(n2^{\omega(n)}\log V)\)。
梦熊 NOI 模拟赛 #20 B. 二分
套路性地枚举 \(v\) 后将 \(<v,\ge v\) 转为 \(01\),此时我们暴力枚举在序列上出现次数 \(\ge2\) 的卡牌的元素,再进行树形 dp 状物,要记录选择 \(1\) 的卡牌数量,最后就是一个求 \(\sum\limits_{i=1}^{M}\sum\limits_{j=0}^{L}(M-i+1)^j(i-1)^jf_j\) 状物,拉插即可,复杂度 \(\mathcal{O}\left(2^{L/2}(2^N)^2+\text{poly}\right)\)。
梦熊 NOI 模拟赛 #20 C. 操作
挺牛的题,考虑把 \(n\) 个数写下来写进一个 \(\log V\) 行 \(n\) 列的矩阵里,有一条线在从下到上扫,如果一个数字从现在开始都“顺从”它对应的 \(L\) 或者 \(R\) 就在这个位置分裂(合理性在于,分裂的时候只需注意这一位符合要求,而不用关心之前填的数字,相当于枚举了 lcp),转移的时候枚举第一个分裂点即可,这样就能得到一个 6D-3D 的 dp,复杂度 \(\mathcal{O}(n^3|\Sigma|^2\log V)\)。
核桃编程 NOI 组周赛
HT-057
HT-057 A. 约数
直接枚举分解 \(p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_n^{\alpha_n}\) 中的 \(\alpha\) 序列排序过后的结果即可,为了处理重复情况可以使用集合容斥,然后当 \(\alpha_i\ne2\) 时暴力枚举即可,否则我们强制钦定此时 \(p\) 不降(用组合数计算重数),当只剩下最后一个数的时候使用筛法加速计算,复杂度我认为是 \(\tilde{\mathcal{O}}(n^{\frac{2}{3}})\) 的。
HT-057 B. 超真实扮家家酒
咕。
HT-057 C. 游乐园
咕。
HT-058
HT-058 A. 下手轻点
注意到对于一个左端点,区间按位与的不同取值只有 \(\mathcal{O}(\log V)\) 种,拆成区间加后直接线段树维护即可,复杂度 \(\mathcal{O}(n\log V\log n+q\log n)\)。
HT-058 B. Kanade 的水杯
咕。
HT-058 C. Ena 的曲绘
咕。
HT-059
看完第一题大概有思路了, \(20\) 分钟写完发现有点问题(漏了一个限制),微调了好多次过了,这个时候大概是一个半小时。第二题看了半个小时猜了一个假结论,发现样例过不去,发现题目看错了。
想了想很快得到了一个 \(\mathcal{O}(n^4)\) 小常数的算法,写完大概是三个小时这样,然后有特殊性质的点没过极限数据过了,很抽象。
然后花了半小时给第三题写了 \(40\) 分的暴力,发现第二题可以优化到 \(\mathcal{O}(n^3)\),写加上调了半个小时就过了,这个时候还剩一个小时和一个大 DS 题,开摆了。
HT-059 A. 黑色节点
容易发现可以通过缩树使得所有点均为黑色,而判断一个状态可否达成可以直接从叶子向根贪心。所以直接 dp 即可,具体而言,设 \(f_{i,j},g_{i,j},h_{i,j}\) 表示当前子树为 \(i\),“预支”了 \(j\) 个点(即父亲要有至少 \(j\) 个被消除),且目前状态为【所有点都为白色 / 只有这个点为黑色 / 其它情况】,时间复杂度 \(\mathcal{O}(n^2)\)。
HT-059 B. K 面骰子
直接 dp,记录当前位置,接下来第一次被钦定强制结束的位置,现在被投掷过的骰子上面一共有几种数字,可以前缀和优化 dp 做到 \(\mathcal{O}(n^3)\)。
HT-059 C. 二维平面
咕。
HT-060
HT-060 A. 不难发现
容易发现任意时刻有用的对至多只有 \(3\) 对,对于固定的 \(y\),有用的 \((x,y)\) 至多只有两对,随便维护一下就可以了,时间复杂度 \(\mathcal{O}(n)\)。
HT-060 B. 显而易见
咕。
HT-060 C. 众所周知
扫描线后历史和线段树板子,复杂度 \(\mathcal{O}((n+q)\log n)\)。
HT-061
拆散做的。
HT-061 A. 信息密度 / CF1801G A task for substrings
考虑先求右端点在 \([l,r]\) 之内的字符串权值和,这是 AC 自动机板子,但这样会多算减去跨过 \(l\) 两端的情况。
所以求出 \(y\) 最大的 \((x,y)\) 使得 \(x<l\) 并且 \(y\ge l\),且 \([x,y]\) 在给定模板串中出现过,那么答案可以分为右端点在 \((y,r]\) 之间的部分(此时可以忽略左端点的限制)和这个串的长度为 \(y-l+1\) 的后缀对应的答案,由于串长和不大,所以可以直接对所有串的反串建 AC 自动机计算即可。
找到最大的 \((x,y)\) 可以在 AC 自动机上对于每个母串的前缀求出最长后缀使得其不失配,然后在线段树上二分即可,复杂度 \(\mathcal{O}(n\log n)\)(视 \(n,q\) 与输入字符串总长同阶)。
HT-061 B. 湖泊
咕。
HT-061 C. 最大期望括号和
首先 \(L=R\) 是经典问题,直接贪心即可,考虑 \(E(X)=\int_{0}^{+\infty}P(X\ge x)\text{d}x\),而这这构成了 \(\mathcal{O}(n)\) 个分段函数,所以直接对于每段 dp 后积分即可,复杂度 \(\mathcal{O}(n^4)\)。
信友队
信友队 2025 图灵杯
A. 棋无常树
咕。
B. 区间集合
咕。
C. 旧事重提
咕。
D. 人造回忆
咕。
APIO 2025
APIO 2025 A. Hack!
每次询问 \(\{x\mid 1\le x\le t\}\) 和 \(\{x\mid x=kt+l+1(1\le k\le t)\}\) 的并就可以得到是否有 \(n\in[l,l+t^2)\)(当然组间的情况还要特别考虑一下),直接二分就可以获得 \(78\) 分,我们考虑求出任意一个答案的倍数,那么可以直接初始用 \(l=5\times10^8,r=10^9\) 来二分出 \(n\),这样代价就符合条件了。
APIO 2025 B. Permutation Game
咕。
APIO 2025 C. Rotating Lines
将直线按照幅角排序后,依次将第 \(\left\lceil\dfrac{n}{2}\right\rceil+i\) 条直线转至与第 \(i\) 条直线垂直即可(\(i=1,2,\cdots,\left\lfloor\dfrac{n}{2}\right\rfloor\)),操作次数 \(\left\lfloor\dfrac{n}{2}\right\rfloor\)。
正睿
NOI 模拟赛 #3
NOI 模拟赛 #3. A. 贸易逆差
考虑对于每次修改被修改的边数根号分治,小 - 小可以暴力模拟,大 - 大可以在值增减的过程中预处理后用桶维护,小 - 大,处理小点的时候暴力,处理大点的时候对每个大点开一个 \(\mathcal{O}(1)-\mathcal{O}(\sqrt n)\) 的查询区间和的分块,即可做到 \(\mathcal{O}(n\sqrt{n})\)(视 \(n,m,q\) 同阶),注意常数优化和细节。
NOI 模拟赛 #4
NOI 模拟赛 #4 A. Cyaneous Rain
显然可以看作是每轮从左边或者右边删数,算每个数被保留的时间乘上权值之和的最大值,一个 \(\mathcal{O}(n^2)\) 的做法是枚举最后一个被删除的点,然后对于两侧求出凸壳后闵可夫斯基和合并,而可以用平衡树动态维护两个凸壳的闵可夫斯基和,即可做到 \(\mathcal{O}(n\log n)\)。
NOI 模拟赛 #4 C. Equinox Flower
树上 TB5 分治模板,使用点分树维护哈希(注意修改与不同阶)维护等价类,复杂度 \(\tilde{\mathcal{O}}(n\sqrt{n})\)(视 \(n,m\) 同阶)。
NOI 模拟赛 #5
是可怕陈旭磊模拟赛诶。
看了一个半小时第一题不会做,写的暴力还挂了,有点慌。
发现第二题是简单数据结构题,但是细节有点多,除了操作 \(3\) 写 + 调了一个小时才过了。比赛过半还是只有 \(30\),有点慌。
操作 \(3\) 又写 + 调了两个小时,是一个非常弱智的问题,并且可持久化有点写挂了,发现被卡空间了,只有 \(50\) 分。
开始极限 Rush,花了 \(25\) 分钟终于过了 B,最后 \(5\) 分钟狂暴 Rush A 的 \(20\) 分暴力未遂,总分 \(0+100+0=100\),居然还有第 \(12\) 名(x
NOI 模拟赛 #5 A. 购物
考虑 dp,记 \(f_{i,j}\) 表示考虑了 \(i\) 个物品,买了 \(j\) 个的最小代价,那么转移可以看成是在 DAG 上游走,其中 \(f_{i,j}\rightarrow f_{i,j+1}\) 有一条边权为 \(a_i\) 的边,\(f_{i,j}\rightarrow f_{i+1,j}\) 有一条边权为 \(2j^{1.5}(\ln j)^{0.5}\) 的边,所求即为 \((1,1)\to (k,x)\) 的最短路,类似 JOISC2022 Sightseeing in Kyoto 一题,使用单调栈动态维护凸包并在其上二分即可做到 \(\mathcal{O}((n+q)\log n)\)。
NOI 模拟赛 #5 B. 开关
注意到,如果操作 1 对应的开关本来就是开的,那么可以直接 continue,否则,将每盏灯“张成”的区间看成是若干个独立的区间,那么所有区间两两不交,也即左右端点单调递增,可以使用可持久化平衡树简单维护,注意空间常数,时间复杂度 \(\mathcal{O}(n\log n)\)。
NOI 模拟赛 #5 C. 上升
咕。
NOI 模拟赛 #6
花子的幽默模拟赛,虽然第一题数据挂了,但是第二题数据也挂了。
NOI 模拟赛 #6 A. 博弈 / CF1906G Grid Game 2
记 \((x,y)\) 上的格子对应的 SG 值为 \(f_{x,y}\),其二维前缀和为 \(s_{x,y}\),如果 \(x>y\),容易有 \(f_{x,y}=s_{x,y}\oplus s_{x-y,y}\oplus f_{x,y}\oplus 1\),所以 \(s_{x,y}=s_{x-y,y}\oplus1\),可以使用欧几里得算法辗转相除算出 \(s_{x,y}\),进而差分出 \(f_{x,y}\),单组询问复杂度 \(\mathcal{O}(n\log V)\)。
NOI 模拟赛 #6 B. 猜大小
咕。
NOI 模拟赛 #6 C. 匹配 / QOJ10322 Matching Query
咕。
ARC
ARC197
ARC197A Union of Grid Paths
算出最上路径和最下路径,做差即可,复杂度 \(\mathcal{O}(n)\)。
ARC197B Greater Than Average
可以证明,必然存在最优解选取的是排序后的一个前缀,直接模拟即可,复杂度 \(\mathcal{O}(n)\)。
ARC197C Removal of Multiples
注意到答案不会超过 \(\mathcal{O}(q\log q)\) 级别,故直接模拟即可。
ARC197D Ancestor Relation
类似【UOJ939 红桃王后】一题,找到关键点递归计算即可,本题中取关键点为当前子树中的根节点,如果有多个可能需要乘上对应的阶乘,复杂度 \(\mathcal{O}(n^3)\)。
ARC197E Four Square Tiles
注意到 \((n,n),(n,2n),(2n,n),(2n,2n)\) 一定会被四个不同的矩形覆盖,将位置设元出来后拆成若干个限制后简单加加减减一下计算即可,复杂度 \(\mathcal{O}(1)\)。
梦熊周赛
MX-X12
MX-X12 A. 变换
注意 \(k\) 无用后模拟即可,复杂度 \(\mathcal{O}(n+\log V)\)。
MX-X12 B. 游戏
以任意一个叶子节点为根,一直询问到出现 \(2\) 操作为止(如果 \(n-1\) 次操作后仍然未出现则答案为根节点),然后询问任意一个子节点,根据结果分讨出在这个子树内外,一直循环这个过程直到可以确定答案为止,总操作次数是 \(n-1\) 的,复杂度 \(\mathcal{O}(n)\)。
MX-X12 C. Another string problem
我的乱搞做法:如果有一个字母出现次数直接对不上就 puts("No"),否则记忆化后暴力,轻松卡,但过了。
MX-X12 D. Coloring Nodes
咕。
MX-X12 E. 地铁 (Easy Version)
显然对于答案 \(a(a\le\min(n,m))\),若记 \(p=\left\lfloor\dfrac{a}{2}\right\rfloor,q=\left\lceil\dfrac{a}{2}\right\rceil\),那么要有 \(np+mp-p^2+nq+mq-q^2-pq\ge nm\)(因为这是经过的点的数量的上界),推一下公式就可以 \(\mathcal{O}(1)\) 计算,具体构造见 Hard Version。
MX-X12 E+. 地铁 (Hard Version)
咕。
Universal Cups
The 2nd Universal Cup. Stage 2: Binjiang
单挑。开场过了 E,发现 A 是简单题,写了半个小时后过了,发现 L 直接决策单调性 + 主席树维护一下 10 分钟就过了,对着 D 这个算几写了好久(没想到三分),在 1:22 的时候通过了这题。
看下榜决定做 J,写完 WA 了,想了二十几分钟不知道哪里挂了,就先去看 G,发现是一眼题。写完挂了,发现要特判 \(n=2\),然后 T 了,花了十几分钟卡卡常剪剪枝就过了。
发现 F 是一眼题,十几分钟就过了,这个时候是 2:47,突然想到 J 分讨漏了一种情况,加上就过了,这个时候是 3:17。
然后做 B,一下子就会做然后写完了,调到了 4:17,发现是一个非常弱智的错误。
发现 H 也是一眼题,写完发现 T 了,卡常还是过不去,然后比赛就结束了。
总结:感觉这场 ACM 质量不是很高,全是一些很板子的题。
A. Almost Prefix Concatenation
对于左端点 \(l\),符合条件的 \(r\) 是一段前缀(可以直接哈希二分找到),前缀和优化 dp 即可,复杂度 \(\mathcal{O}(n\log n)\)。
B. Palindromic Beads
按照 dis 从小到大更新每一对颜色的 dp 值即可,发现 dp 值的修改可以拆成 dfn 序列上的矩形 chmax,复杂度 \(\mathcal{O}(n\log^2n)\)。
C. Clique Challenge
不妨假设 \(\mathit{deg}_i\) 单调不降,那么枚举团中编号最小的点,那么每个点的出度不超过 \(\sqrt{2m}\),暴力计算即可,此时复杂度为 \(\mathcal{O}(\sum\limits_{i=1}^{n}2^\frac{\mathit{deg}_i}{2})\),根据数学调整法可知复杂度最劣为 \(\mathcal{O}\left(\sqrt{m}2^{\frac{\sqrt{2m}}{2}}\right)\)。
D. Discrete Fourier Transform
每个数可以被拆成 \(\boldsymbol{x}_i+\boldsymbol{v}_i\) 的形式,其中 \(|\boldsymbol{v}_i|=1\),那么二分后简单几何判断一下即可,复杂度 \(\mathcal{O}(n^2+n\log V)\)。
E. Robot Experiment
枚举每一步是否成功执行即可,复杂度 \(\mathcal{O}(2^nn)\)。
F. Flying Ship Story
发现任何情况下,有用的修改操作至多只有 \(\mathcal{O}(1)\) 个,暴力维护即可,复杂度 \(\mathcal{O}(q)\)。
G. GCD of Pattern Matching
首先特判 \(n=2\),否则可以忽视首位不为 \(0\) 的限制,根据输入模式串是否包含 \(n\) 个不同的字母分讨即可,单组询问复杂度 \(\mathcal{O}(\log V)\),其中 \(V=|P|^m\)。
H. Hurricane
暴力跑补图最短路一轮是 \(\mathcal{O}(n+m)\) 的,而注意到当在补图上,若 \(\mathit{deg}_i+\mathit{deg}_j<n\),那么一定有 \(\mathit{dis}(i,j)\le2\),所以只需要对于所有 \(\mathit{deg}_i\ge\dfrac{n}{2}\) 的 \(i\) 跑最短路即可,而这样的 \(i\) 的个数是 \(\mathcal{O}\left(\dfrac{m}{n}\right)\) 的,这样复杂度就是 \(\mathcal{O}\left(m+\dfrac{m^2}{n}\right)=\mathcal{O}(m\sqrt m)\) 的了。
I. Monster Generator
注意到更换贪心顺序的更迭至多只有 \(\mathcal{O}(n^2)\) 次,将这 \(\mathcal{O}(n^2)\) 段挑出来分别处理,那么最小代价关于时间是一个 \(n\) 条一次函数取 \(\max\) 的形式,使用凸包维护即可,复杂度 \(\mathcal{O}(n^3\log n)\),我认为排序的 \(\log\) 可以去掉。
J. Find the Gap
发现当答案不为 \(0\) 时,必然存在一种可能的平面选取方案经过至少两个不共线的 \(\boldsymbol{v}_i-\boldsymbol{v}_j\),其中 \(\boldsymbol{v}_i\) 为第 \(i\) 个点坐标所对应的向量,枚举是哪两个向量,就可以叉乘出平面的法向量,再套用点到平面距离公式算出每个点到平面的有向距离后计算极差即可,复杂度 \(\mathcal{O}(n^5)\)。
K. Sequence Shift
把所有 \(10^9-\dfrac{9\times10^9}{\sqrt{n}}\) 以上的数拎出来暴力更新答案,没更新到的就暴力计算,可以证明正确率很高,并且复杂度期望正确。
L. Partially Free Meal
不妨假设 \(b_i\) 递增,则只有被选中的编号最大的 \(i\) 对应的 \(b_i\) 才会被贡献入答案,而显然最优的 \(i\) 关于 \(k\) 单调,计算 \(i\to k\) 的贡献可以使用主席树维护,复杂度 \(\mathcal{O}(n\log^2n)\)。
The 2nd Universal Cup. Stage 9: Qinhuangdao
单挑。开场 \(13\) 分钟过了 AGJ,然后会了 F 但是调了 1h,发现是一处细节写挂了,5 分钟秒了 D 但是 WA 了一发,发现 M 做过,这个时候是 1:20。
然后会了 I,真难写啊,写了一个半小时才过,一眼秒了 B,推万欧写了 20 分钟,发现 E 直接状压就做完了,这个时候 4:14,剩下的题想了半个小时还是不会做。
A. Make SYSU Great Again I
注意到 \(\gcd(i,i+1)=1\) 后随便构造即可,复杂度 \(\mathcal{O}(k)\)。
B. Yet Another Subsequence Problem
子序列有个矩阵乘法求法,然后就是万欧板子题了,复杂度 \(\mathcal{O}(\log(A+B))\)。
C. Palindrome
咕。
D. Yet Another Coffee
无论买的咖啡数量为多少,砍价后我们肯定是要让咖啡之间的价格差越大越好,所以将优惠券按照生效截止时间从小到大排序后每次优惠掉最便宜的那杯即可,最后排个序即可,复杂度 \(\mathcal{O}(n\log n)\)。
E. Coloring Tape
直接记录哪些位置有“线头”后状压 dp 即可,复杂度 \(\mathcal{O}(2^nnm+R(m+q)+C)\),其中 \(R\) 为合法转移数量,\(C\) 为得到 \(R\) 的复杂度。
F. Mystery of Prime
考虑记 \(f_i\) 表示考虑了 \(1\sim i\) 的前缀且 \(i\) 强制保留的情况下,最多能保留几个数,转移时枚举前一个不变的数即可,而当 \(i-j\ge6\) 的时候 \(f_j+1\to f_i\) 必然合法,否则分类讨论一下就好了,复杂度 \(\mathcal{O}(n+V)\)。
G. Path
最优策略下肯定只会往右和往下走,直接模拟即可,复杂度 \(\mathcal{O}(n+m)\)。
H. Quake and Rebuild
感觉和 [Ynoi2007] rfplca 没有区别啊当然那个题我也不会,分块完在块结构上搞搞就好了,时间复杂度 \(\mathcal{O}((n+m+q+\sum k_i)\sqrt{n})\)。
I. Phony
直接模拟即可。
二分算出目前最小的被波及到的数除以 \(k\) 的值后数据结构上搞搞就行,这东西我不想描述也不会描述,复杂度 \(\mathcal{O}(n\log n)\)。
J. Keyi LIkes Reading
算出每个子集是否合法后枚举子集状压 dp 即可,复杂度 \(\mathcal{O}(3^n)\),可以通过或卷积做到 \(\mathcal{O}(2^nn)\)。
K. Make SYSU Great Again II
很神秘的构造题,记 \(k=\left\lceil\log n\right\rceil\),考虑黑白染色,其中左上角格子为黑色,并且对于每条只经过对角线(主 / 副)都赋上一个权值 \(v\),使得每组 \(v\) 按顺序读都是 \(k\) 阶格雷码的一个前缀,黑格就是两部分拼起来,白格就是周围黑格的或再取反,时间复杂度 \(\mathcal{O}(n^2)\),太难说了,看代码吧。
代码
#include <bits/stdc++.h>
using namespace std;
int n, k;
vector<int> f;
vector<int> Gen(int x) {
if (!x) return {0};
vector<int> p = Gen(x - 1), q = p;
reverse(q.begin(), q.end());
for (auto &v : q) v |= (1 << (x - 1));
p.insert(p.end(), q.begin(), q.end());
return p;
}
int calc(int x, int y) {
if (x < 0 || x >= n || y < 0 || y >= n) return 0;
if ((x + y) & 1) {
return ((1 << (k + k)) - 1) ^ (calc(x - 1, y) | calc(x + 1, y) | calc(x, y - 1) | calc(x, y + 1));
}
return (f[(x + y) / 2] << k) | f[(n - 1 - x + y) / 2];
}
signed main() {
scanf("%d", &n), k = 0;
while ((1 << k) < n) ++k;
f = Gen(k);
puts("Yes");
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%d%c", calc(i, j), " \n"[j == n - 1]);
}
}
return 0;
}
L. Yet Another Maximize Permutation Subarrays
Fun Fact:有人题目看成了求子连续段个数。
那不是每个值域上的前缀分讨随便一下就好了吗,就是,增量对是 \(\mathcal{O}(n)\) 的,每个判一下就好了,复杂度 \(\mathcal{O}(n)\)。
M. Inverted
做 \(n\) 次树形 dp 即可(维护当前节点连通性),一个便于思考的方法是考虑把两棵树在三维空间中叠起来可能会好思考一点,复杂度 \(\mathcal{O}(n^2)\)。
The 2nd Universal Cup. Stage 11: Nanjing
单挑。开场半个小时过了 IFG,C 交错题 WA 了一发。其中 G 和 C 有点小卡人(
M 降智写了 Seg Beats 做法,加上交错题和没关 freopen 一共吃了三发罚时,没救了。
A 一处 \(n,m\) 打反吃了一发罚时,这个时候是一个半小时,然后写了一个小时的 D。
给 L 猜了一个结论,WA。自己感觉有点假,后来发现是写挂了,就过了。
最后两个多小时因为有点事,所以没过题。
A. Cool, It’s Yesterday Four Times More
bfs 算出每只袋鼠的相对可达位置,bitset 对每只袋鼠判断是否每只其它袋鼠都有其不可达位置但是它可达的相对位置,复杂度 \(\mathcal{O}\left((nm)^2+\dfrac{(nm)^3}{w}\right)\)。
B. Intersection over Union
咕。
C. Primitive Root
观察到 \(x\oplus (P-1)\) 构成了 \(\log V\) 个区间,每个区间算一下即可,复杂度 \(\mathcal{O}(\log V)\)。
D. Red Black Tree
记 \(f_{i,j}\) 表示 \(i\) 为根的子树内,每个点到根的距离的黑点个数均为 \(j\) 的最小代价,容易发现 \(i\) 是凸的,dsu(长链剖分)+ 平衡树维护 slope trick 即可做到 \(\mathcal{O}(n\log n)\)。
E. Extending Distance
咕。
F. Equivalent Rewriting
注意到序列不变当且仅当每个位置最后一次受影响的操作不变,所以钦定的先后关系构成一个 DAG,如果有一次取数的时候队列的大小不为 \(1\) 就找到了对应的方案,复杂度 \(\mathcal{O}(n+m)\)。
G. Knapsack
按照重量排序后,我们免费拿的一定是一个后缀,枚举分界点,对前面做背包后面用堆维护即可做到 \(\mathcal{O}(nm+n\log n)\)。
H. Puzzle: Question Mark
咕。
I. Counter
将限制按照时间排序后判断是否对于相邻两个均合法即可,复杂度 \(\mathcal{O}(n\log n)\)。
J. Suffix Structure
咕。
K. Grand Finale
咕。
L. Elevator
一个显然的贪心:按照楼层高度从大到小排序,维护一个 multiset 表示没用完的电梯载重,每个物品能选就选最小的剩余载重大于等于它的电梯,否则新开一辆,正确性不会证但可以感受到,复杂度 \(\mathcal{O}(n\log n)\)。
M. Trapping Rain Water
容易发现最大值前后独立,所以开两棵线段树使用 seg beats 维护区间 chmax 和区间求和即可,复杂度 \(\mathcal{O}(n\log n)\)。
The 2nd Universal Cup. Stage 20: Ōokayama
单挑。开场半小时过了 ACB,然后大概会了 E,突然忘了线性代数知识,WA 了一发。
这个时候发现 H 是广义 SAM 板子,写了,在第 54 分钟的时候过了。
然后发现 E 漏了一种情况,又 WA 了两次才过,这个时候是 1:18。
突然对 M 有个神秘哈希做法,写了写就过了,此时是 1:42。
F 直接模拟即可,好久没写表达式解析了,写写写 2:30 过了。
然后在 L 和 P 之间反复横跳,会 P 要写的时候被叫去参加科技节活动了。
A. Numerous Elimination
考虑对每个人赋个势能,初始有 \(f_0=0\),那么有 \(2f_i+1=f_{i+1}+f_0\),得 \(f_i=2^i-1\),而答案为 \(\sum\limits_{i=0}^{n-1}f_i=2^n-n-1\),复杂度 \(\mathcal{O}(\log n)\)。
B. Almost Large
直接上三进制高维前缀和用 dp 维护可达性就做完了,复杂度不会证。
C. Yet Another Simple Math Problem
容易证明 \((a,b)\) 的组数就是 \((x,y)\) 的组数。
假设 \(m=\left\lfloor\sqrt{n}\right\rfloor\),那么当 \(\max(x,y)>m\) 的时候必然不合法,当 \(\max(x,y)<m\) 的时候必然合法,\(\max(x,y)=m\) 的情况是好算的,复杂度 \(\mathcal{O}(1)\)。
D. Spacecraft
咕。
E. R-Connected Components
将所有可能的圆上整点预处理出来,由于第一象限内所有的整点关于 \(y=x\) 对称,所以用 \(\gcd\) 算算就可以了,时间复杂度 \(\mathcal{O}(\sqrt{N})\)。
F. \(N^a(\log N)^b\)
直接用表达式解析算法模拟即可,复杂度 \(\mathcal{O}(n)\)。
G. Cola
咕。
H. 404 Chotto Found
对输入的所有串建立广义 SAM 后,一个字符串的所有子串可以表示为 fail 树上若干条树链的并,按照 dfn 序排序,然后对于每个点到根的链上的每个点的点权 \(+1\),对于每对相邻的两个点的 LCA 到根的链上的每个点的点权 \(-1\),即可后算出每个等价类被几个文本串包含,然后直接统计就好了,复杂度 \(\mathcal{O}(n(\Sigma+\log n))\)。
I. T Tile Placement Counting
咕。
J. Set Construction
咕。
K. Dense Planting
std 做法:注意到当点数为 \(5\),边为 \((1,2,e),(2,3,1),(3,4,f),(4,5,d-f),(5,1,a-e),(2,5,b-e-1),(3,5,c-f-1)\)(其中第三个数字表示同样的边的数量)时,图的生成树个数为 \((ab-e^2)(cd-f^2)-ad\),只需要找到一组符合条件的 \(a,b,c,d,e,f\) 即可,可以在 \([K^{1/4}-40,K^{1/4}+40]\) 以内枚举 \(a,b,c,d\) 后质因数分解并逐一 check 即可。
L. Next TTPC 3
咕。
M. Sum is Integer
随便取两个大质数,我们可以粗略地认为一个数是整数当且仅当它们在模这两个大质数意义下的数值相等,使用哈希表维护分数前缀和取模后的对两个大质数分别取模后的值的差即可即可,复杂度 \(\mathcal{O}(n\log P)\)。
N. Bracket Sequestion
咕。
O. 2D Parentheses
咕。
P. Bridge Elimination
咕。
云斗
模拟赛 #5
模拟赛 #5 A. War
由于 \(\min(n,m)\le12\),所以直接轮廓线 dp 即可,记录一下每一行以及当前列的状态(之前的车能覆盖到这里(从左 / 上)且继续下去 / 无特殊要求 / 这里被钦定要被从反方向覆盖(从右 / 下)),转移的时候分【放置车 / 不放置车但无所谓 / 不放置车强制钦定右边覆盖 / 不放置车强制钦定下边覆盖】讨论即可,时间复杂度 \(\mathcal{O}(3^{\min(n,m)}nm)\)。
模拟赛 #5 B. Bipartite
咕。
模拟赛 #5 C. Graph / [PA 2016] Pokrycia
很牛的题。考虑转最大独立集并记 \(N_i\) 表示第 \(i\) 个点的领域,那么 \(N_1\oplus N_2\) 必然是 \(\{1,2\}\) 的子集,否则可以相互抵消,此时可以将它们合并,如果 \(1,2\) 之间没有边那么这个点的权重可以乘以 \(2\),然后就像二进制加法器类似,每次加入 \(1\) 并且考虑每一步是否合并,最后会得到一个状态,可以用一个数字 \(m\) 表示,记 \(f_{n,m}\) 表示 \(n\) 个 \(1\) 合并成状态 \(m\) 的方案数,那么考虑 \(k=\operatorname{lowbit}(m)\) 怎么来的(肯定和最后一个 \(1\) 有关),因为这个二进制加法器是从高位到地位确定的,如果是它一路顺过来的那贡献就是 \(f_{n-1,m-1}\),如果是顺到 \(1\) 后面和 \(k\) 合并但是不乘 \(2\) 来的那贡献就是 \(f_{n-1,m+k-1}\),所以 \(f_{n,m}=f_{n-1,m-1}\oplus f_{n-1,m+k-1}\),这个时候再考虑 \(g_{n,m}\) 表示答案,一个 \(f_{n,m}\) 对 \(g_{n,k}\) 的贡献是什么呢?首先 \(k\) 是 \(m\) 的子集,并且除非 \(k=m\) 或者 \(k=m-\operatorname{lowbit}(m)\) 否则贡献都可以抵消(关于后面任取一个点与这个不用选的点的边的存在性对合),时间复杂度 \(\mathcal{O}(n^2+T)\)。
模拟赛 #6
开局会了 A,写了十几分钟后发现过不了大样例,后来发现是忘了重构,加上完后大概半小时的时候交上去 RE,调试了十几分钟发现其实是 MLE,加上优化后就 67 了,发现自己一处复杂度写假了,在第 57 分钟的时候通过了本题。
然后看了 B 和 C,C 想了一会不会后发现 B 是一眼题,写挂了几次在比赛过半的时候获得了 70,发现复杂度有一处写假了,改了 15 分钟变成了 40,这个时候发现原先的代码只要加一句复杂度就对了,这个时候比赛过去了 2 个小时 44 分钟。
C 看了,不会做,3 小时 23 分钟的时候交了写加卡常的指数级暴力,获得了 20 分,接下来的时间尝试通过别的部分分无果。
模拟赛 #6 A. guitar
注意到发生字母“合并”的情况至多只有 \(|\Sigma|-1\) 次,每次合并后对于每个字符串暴力计算 \(f(i,j)\),表示如果原字符 \(i\) 变换后字典序小于 \(j\) 变换后,那么就会有 \(f(i,j)\) 个字符串比它小(我们只关心两个字符串第一个不同的位置),用 Trie 树维护即可,复杂度 \(\mathcal{O}(n|\Sigma|^2)\)。
模拟赛 #6 B. chair
容易发现只需要关心作为后缀最大值的修改,每次 1 操作后直接计算答案的改变,而对于 2 操作,发现对于一个操作 2,其成为 / 取消作为后缀最大值的次数是 \(\mathcal{O}(1)\) 的,线段树上二分找到所有被影响的位置,它对答案的贡献就是它到上一个后缀最大值之间 1 操作的个数(指的是在这段时间中被最后一个归零),对于第一个位置需要特别处理,使用 set 维护后缀最大值,再使用一些线段树维护上述所有求和操作即可,复杂度 \(\mathcal{O}(n\log n)\)(视 \(n,m,q\) 同阶)。
模拟赛 #6 C. cucumber
咕。
模拟赛 #7
开场发现 C 做过,先交了。发现 B 也见过,30 分钟写加调完了,TLE,发现复杂度多了一只 \(n\),改完后还是 TLE,加个手写哈希表就过了,这个时候比赛过去了一个小时。
发现第一题看着很简单,写写写发现题目有一处看错了,改了一下交上去 WA 0 分,冷静想了一下发现没有考虑范围 \(\ge y-x+1\) 的限制,怀揣着改一改就过了的想法,发现二分单调栈写挂了,并且正确性好像也没有保障。
一个做法是分块或者树套树,这时突然发现好像可以直接糊个 KTT!就过了,最后两个半小时就 AK 了。
模拟赛 #7 A. Function
容易发现这是一个 dp 式子,所以单组询问的答案为 \(\min\limits_{i=\max(y-x+1,1)}^{y}(s_y-s_{i-1})+a_i\times(x-(y-i+1))\),容易发现 \(i\to x\) 的贡献是关于 \(y\) 是一个一次函数且斜率非正,使用 KTT 维护即可,复杂度 \(\mathcal{O}(n\log n)\)。
模拟赛 #7 B. Inversion / [PA 2019] Desant
如果直接暴力维护出现的值然后状压 dp 的话复杂度是 \(\mathcal{O}(2^nn^2)\) 的,注意到对于每个前缀的值构成的集合,对于当前前缀的状态,我们只需要关心值构成的每个连续段中出现的数的个数,所以状态数至多是 \(\mathcal{O}(3^{n/3})\) 的,使用二进制优化计算和手写哈希表即可通过,复杂度 \(\mathcal{O}(3^{n/3}n^2)\)。
模拟赛 #7 C. Halt / QOJ1192 Halting Problem
发现只考虑失配边的话构成若干个基环树,而走配对边完的可能状态集合大小(把当前节点和数字看成是一个 pair)是 \(\mathcal{O}(n)\) 的,所以我们只需要快速求出走失配边到哪里停止,将树上部分和环上部分分开考虑,分别使用数据结构维护即可,复杂度 \(\mathcal{O}(n\log n)\)。
模拟赛 #8
打到一半睡着了,是一个可怕的梦,在梦里,我无法操控自己陌生的身体,只能在强烈的异己感下目睹着自己走向末日的终结,后面忘了,一起来发现只剩一个多小时了,很不牛。
发现第二题是弱智题半小时过了,第一题写了个线段树合并维护 ddp,被卡常了,很不高兴,TLE 70。
然后来不及做第三题了。
模拟赛 #8 A. triangle
你有一个 ddp 做法,你用线段树合并维护时间戳维上的线段树,你大力卡常,你过了,时间复杂度 \(\mathcal{O}(n\log n)\)。
模拟赛 #8 B. dog
把所有可能的等价类状态搜出来直接 dp 就过了,复杂度 \(\mathcal{O}(nS)\),其中 \(S\) 为等价关系的情况数,当 \(k=25\) 时 \(S=98747\)。
模拟赛 #8 C. elephant
咕。
JOISC
JOISC2023 Day2
开场会了 B,十五分钟过了,然后会了 A 的乱搞,想了好久还是不会做,突然发现乱搞好像是对的,要写的时候发现题目看错了,然后会做了,调了调在两个小时的时候过了。
第三题毫无思路,只会最低档 28 分暴力,不是很想打,开摆去补别的题了。
JOISC2023 Day2A Belt Conveyor
任意取一个点为根,那么注意到如果两个点的深度模 \(3\) 相同,那么两个点与它们的儿子间是否有东西不会相互影响。
那么,我们定义一个点是未确定的当且仅当它旁边至少有一条未定向的边,那么每次按照深度模 \(3\) 将点分为至多 \(3\) 个等价类,选取未确定的点最多的一类,并将所有已确定且出度在这个等价类里的边翻转,然后查询。
这时,对于一个等价类中的点,如果操作完它上面仍然有物品那么与它相邻的所有边都确定了,如果任意一个子结点上有物品那么这条边一定是叶向边,如果这两种情况都不符合,那么它到父亲的边一定是根向边。
这样,一轮操作中,每个未确定的点一定能够确定至少一条邻边,所以这样一次询问能够至少确定 \(\dfrac{1}{3}\) 的边,总询问次数为 \(\log_{3/2}n\)。
JOISC2023 Day2B Council
考虑对于每个人分别计算,那么通过一些预处理和位运算操作,我们可以将问题转化为给定 \(S_i\) 和 \(a_i\),对于每个 \(i\) 求出最大的 \(\operatorname{cnt}(S_i\operatorname{and}a_j)(j\ne i)\),这可以使用 FMT 轻松解决,复杂度 \(\mathcal{O}(nm+2^m)\)。
JOISC2023 Day2C Mizuyokan 2
开局先将询问的左端点加 \(1\) 变成序列上问题并且序列两端有无穷个 \(0\)。
考虑怎么用一个比较简单的方式计算答案,考虑询问 \(l=1,r=n\) 的时候如何计算,那么一个观察是小段的长度均为 \(1\),另一个观察是假设所有大段是 \([l_1,r_1],[l_2,r_2],\cdots,[l_m,r_m]\),那么每一个区间的和必然要大于左右两边的元素并且 \(r_i+2=l_{i+2}\) 并且 \(l_1\le 2,r_m\ge n-1\)。
一个人类智慧的结论是,最后的 \(l,r\) 位置关系可以被弱化为 \(l_i+2\le r_i\),证明可以直接构造。所以我们对于每个 \(l\) 求出第一个合法的 \(r\),询问的时候从右到左枚举每个区间贪心更新答案即可,对于两端要特殊考虑。
考虑多次询问且带修怎么做,容易发现修改只会影响到至多 \(\mathcal{O}(\log V)\) 个 \(l\) 所对应的 \(r\),而可以发现我们只关心 \(r-l\le 2\log V+10\) 的区间。
将每个 \(l\) 以及对应的 \(r\) 视作一个函数,那么这个过程是可以用线段树维护的,具体地,对于线段树上的每个区间以及每个 \(x\in[r-1,r+2\log V+10]\),维护出如果整体函数传入这个参数 \(x\),那么会选取多少个区间,以及从哪里出来,那么这样的复杂度就是 \(\mathcal{O}(n\log n+q\log n\log V)\) 的了。
JOISC2023 Day4
开局会了 C,十分钟过了,然后被抓去做实验会考了!很不乐。回来没时间了口胡到 \(71+25+100=196\)。
JOISC2023 Day4A The Last Battle
神秘通信题。考虑把位置也给存进去,具体怎么弄呢?我们考虑主对角线,然后对于每个被扣掉的位置都给剩下的 \(6\sim7\) 个位置填上一个两个人约定好的权值,使得任意两种情况不会被混淆(具体而言,存在至少一位在两种情况下都不会交互库操控并且在约定中不同),调整法多跑几次就好了,但这样如果扣除的是主对角线上的格子的话还少了一位,怎么办呢,我们发现此时主对角线有 \(7\) 个位置可以表示信息,把这一位塞到这里就好了。
JOISC2023 Day4B Security Guard
很牛的题!考虑不能新增加边也不能摧毁边的情况,我们把岛的危险度看成是岛的海拔,船看成是柱子,柱子上的方块可以任意移动,那么,每根柱子的高度至少要为其连接的两座岛屿的高度的最小值。
这时候,我们想象“涨潮”的过程,那么如果在海水高度 \(c\to c+1\) 的时候有岛屿被分割了,就要将它们的高度“提升”为 \(c+1\),具体而言,在每个被淹没的岛屿之间放 \(1\) 个方块即可(因为海水高度到达 \(c\) 的时候岛屿仍然构成一个整体,所以这个方块可以自由移动),所以答案为 \(\sum\limits_{e}\min(h_{e_x},h_{e_y})+\sum\limits_{i=1}^{\max\{h_x\}-1}c(G'_i)\),其中 \(c(G)\) 表示图 \(G\) 的连通块个数,\(G'_i\) 表示图 \(G\) 在只保留点权 \(\le i\) 的点的时候的连通块数。
显然,图是一棵树的时候是最优的,经过适当化简,可以发现原式就等于 \(\sum\limits_{e}(h_{e_x}+h_{e_y})+\max h_x-\sum h_x\),后面一项是定值,固我们只需要考虑前一项,而我们增加边的时候肯定有一端是 \(h\) 最小的点,这可以倒着考虑(从菊花开始,逐步用原树上的边来替换),使用启发式合并维护每个连通块的增量和全局的增量对应的小根堆计算即可,时间复杂度 \(\mathcal{O}((n+m)\log^2n)\)。
JOISC2023 Day4C Bitaro's travel
一个显然的结论是“掉头”的次数是 \(\mathcal{O}(\log V)\) 级别的,所以直接模拟即可,复杂度 \(\mathcal{O}(n\log V)\)(视 \(n,q\) 同阶)。
杂题
QOJ4894 学姐买瓜
CF348D Turtles
LGV 板子,也就图一乐,复杂度 \(\mathcal{O}(n^2)\)。
AGC041F Histogram Rooks
注意到若记所有行集合构成的全集为 \(U\),列集合构成的所有连续段为 \(C\),那么答案即为 \(\sum\limits_{S\subseteq U}\sum\limits_{T\subseteq S}(-1)^{|T|}\prod\limits_{c\in C}\left(2^{|p\mid p\in c,p\notin\cup S|}-[\exists p,p\in c,p\in\cup S_i,p\notin\cup T_i]\right)\),在笛卡尔树上直接 dp 记录当前子树内 \(|S|\) 大小以及是否存在 \(p\in\cup S_i,p\notin\cup T_i\) 即可,时间复杂度 \(\mathcal{O}(n^2)\)。
CF1781G Diverse Coloring
注意到 \(n\ge5\) 时答案一定可以取到 \(n\bmod2\),那么当 \(n>13\) 时,必然存在一条边可以把树劈成这样的两个部分,这样每棵树的大小都不超过 \(13\),分别爆搜后拼起来就好了,复杂度 \(\mathcal{O}(n)\)。
P6803 星际迷航
换根 dp 算出对于每个点,有多少个点满足,如果将它上面挂一个必败节点,那么之前提到的那个点必胜(这可以通过 bitset 并行计算),然后矩阵快速幂即可,复杂度 \(\mathcal{O}\left(\dfrac{n^2}{w}+\log D\right)\),但是好像过不去,所以还是老老实实写换根 dp 了,复杂度 \(\mathcal{O}(n+\log D)\)。
CF1767F Two Subtrees
双子树莫队维护即可,众数可以用值域分块处理,复杂度 \(\mathcal{O}(n\sqrt{n})\)。
CF1408H Rainbow Triples
考虑二分答案 \(v\),那么我们选取的 \(0\) 肯定是开头的 \(v\) 个以及结尾的 \(v\) 个且一定按照顺序配对,并且要在每个对应的区间内选出一个互不相同的非零元素。
考虑 Hall 定理,由于这些区间有交,所以必然可以假设选取的是一段连续的区间,假设此时从左数和从右数的第 \(i\) 和第 \(j\) 个 \(0\) 分别是 \(a\) 和 \(b\)(\(i,j\le v\)),那么一定有 \(v-(i-1)-(j-1)\le s(a,b)\),即 \(v\le s(a,b)+i+j-2\),其中 \(s(a,b)\) 表示 \((a,b)\) 这段区间里的非零元素种类数。
注意到 \(0\) 的编号和二分的 \(v\) 无关,所以可以直接计算 \(\max(\min(i-1,j-1),s(a,b)+i+j-2)=s(a,b)+i+j-2\) 的最小值,使用线段树简单维护即可,复杂度 \(\mathcal{O}(n\log n)\)。
CF1712F Triamater
记 \(f_i\) 表示 \(i\) 到最近节点的距离,那么所求即为 \(\max(d(i,j),f_i+f_j+x)\),考虑二分答案并枚举 \(i\),那么符合 \(f_i+f_j+x\ge\mathit{ans}\) 的 \(j\) 的 \(f_j\) 是一段后缀,对于 \(f\) 值域上的每个后缀都求出对应的点集直径即可。
考虑优化掉二分的 \(\log\),我们发现判断是 \(\mathcal{O}(1)\) 的,所以可以直接从小到大更新答案,均摊是 \(\mathcal{O}(n)\) 的,总复杂度 \(\mathcal{O}(n\log n+qn)\)。
Hackerrank Triomino Tiling
注意到这相当于轮廓逐步从左上角变换为右下角的过程,将向上走视作 0,向下走视作 1,那么一张骨牌就是将一个 1 向左挪 \(3\) 位,所以可以把每个位置按照模 \(3\) 意义下的剩余类分别考虑,那么相当于询问将一个形如 \(0001111\to 1111000\) 的方案数,其中一次交换一对 01,这是经典问题,可以使用杨表钩子公式解决,单组询问复杂度 \(\mathcal{O}(nm)\)。
QOJ6355 5
先将所有数都减去 \(1\),记 \(f_{i,j}\) 表示能否选出 \(j\) 个数和为 \(i\),由题目限制,当 \(i\) 一定时,满足 \(f_{i,j}=1\) 的 \(j\) 构成了 \(\mathcal{O}(1)\) 个区间,而不同的值的个数只有 \(\mathcal{O}(\sqrt{n})\) 种,所以再使用多重背包优化即可,复杂度 \(\mathcal{O}(n\sqrt{n})\)。
CF1924E Paper Cutting Again
套路性地转为考虑所有线的排列后从前往后删除每条线,分别计算每条线被割掉并且割掉完比结束的概率即可,时间复杂度 \(\mathcal{O}(n+m)\)。
Gym103428C Assign or Multiply
套路性地取原根转化为加法,使用二进制分组后可以变成 \(\mathcal{O}(P)\) 次一个区间对另一个区间取或,而这可以使用线段树上二分以及哈希找到两个区间所有不同的位置,可以证明这就恰好等于 \(0\to 1\) 数量的两倍,均摊一下复杂度就是 \(\mathcal{O}(n+P\log^2P)\) 的了。
LCS0 - Longest Common Subsequence
你说得对,但是最长公共子序列可以做到 \(\mathcal{O}\left(\dfrac{n^2}{w}\right)\)。
[THUPC 2025 决赛] 一个 01 串,n 次三目运算符,最后值为 1(加强版)
绝世幽默题,大家快来做!
QOJ6354 4
类似三元环计数给原图点重标号并给边定向,然后枚举一个点,求出以它为编号最小的点的所有三元环,把它相对的边拎出来,那么所求就是每个这样的图的三元环数量之和,使用 \(\mathcal{O}\left(\dfrac{nm}{w}\right)\) 的暴力即可,复杂度 \(\mathcal{O}\left(n\sqrt{n}+\dfrac{n^2}{w}\right)\)(视 \(n,m\) 同阶)。

浙公网安备 33010602011771号