集训记录
20260727
T1 P11753 签,注意到可以单调栈维护。
T2 P14648 签,注意到 trie 的 dfs 序最优,tab 只在空串有用,因此每棵子树最深子树在最后遍历最优
T3 QOJ13235 求无向图定向方案数,使得 1 和 2 的可达点集有交。签,考虑转化为 forall 型问题,于是求出 1 和 2 可达集恰好为 S 的方案数,可以容斥求出。随后枚举割集统计答案。
T4 QOJ8109 给定无向连通图,每次询问删去一些边,问还有几个点是每个点都可达的。考虑提取一棵生成树,得到 dfn 序,删除树边相当于将 dfn 序分割为三个强联通的区间,二维前缀和求出强联通区间之间两两的边数,减去非树边减去的边数,得到边的情况,最后 tarjan 缩点即可。
20260728
A 分层图最短路。
B 签。
C 考虑原题条件可转化为相邻位置覆盖次数差不超过 \(1\),对应的合法方案数是 \(2^{\sum_{i=1}^{n-1}[t_i=t_{i+1}\wedge t_i=0]}\),于是 2d-1d dp 即可。
D 签。
E 即和最大的两个长度为 k 的不交区间加上两个等差数列。
F DFS 一遍即可。
G 签。
H 拆期望即可。
I 树上倍增,用类似单侧递归线段树的方式统计答案。
J 字典树,或哈希表。
K 注意到环的奇偶性对称。
20260730
信友队图灵杯中级组。
A BIT 维护,签。
B 单调栈维护,用游指针替代二分消掉 log,签。
C 考虑每一个值域连续的消除区间,一定有若干关键点,一些区间左端点连续至关键点(不含)且右端点为关键点,一个左端点为关键点。因此考虑贪心,按第一关键字长度降序,第二关键字左端点升序。使用线段树维护前缀最小值,区间不全为 \(1\) 不操作,操作后全局前缀最小值 \(<0\) 撤销操作。
省流:假做法。hack:8 1 2 5 4 3 6 7 8
正确做法是用小根堆反悔贪心。处理出所有极大区间,按左端点排序,贪心使用灵魂,当灵魂数过少时贪心将堆顶退堆,单点不入堆,还需处理前一个右端点与后一个左端点重合的情况,此时剩单点要并到后一个左端点。
分类讨论一下这个重合的端点放在前面还是后面,跑两遍应该也可以。
20260801
C,E,H 签
F 直接套路性地推式子莫反。
G 难点在于读题,要看见题目里一个很不起眼的词语“实数序列”。在整数上离散地也能很复杂地做并且对拍不出问题。发现是实数序列就简单了,把期望拆开算,不重合的部分直接中点差,重合的部分就是这样一个积分式:
可以直接算:
当然也可以把图像画出来发现是两个三棱锥。
I 难点在于读题。发现可以贪心地跳,有白格都来白格,有黑格优先走红格,没有走白格,如果还是没有新建一个,黑格同理。特判全白。
J 考虑 cdq 分治统计答案。设当前长度为 \(m\),显然有两种时间复杂度不同的做法。一种是暴力,复杂度 \(O(m^2)\)。一种是 FFT,考虑每次分治时 \(L[i]R[i-k]\) 会对 \(Ans[k]\) 产生贡献,把 \(R\) 反转变为 \(L[i]R[n+k-i]\) 对 \(Ans[k]\) 产生贡献,就是非常显然的卷积形式了,可以 FFT 优化,复杂度
\(O(n\log n)\)。为了平衡复杂度,考虑块长 \(B\),区间长度小于 \(B\) 时暴力统计答案,否则 FFT 优化,容易推出复杂度为 \(O(\frac nB n\log n+\frac nB B^2)\),当 \(B=\sqrt{n\log n}\) 时复杂度最优为 \(O(n\sqrt{n\log n})\)。注意这样取 \(B\) 过不去,因为暴力常数远小于 FFT 所以 \(B\) 应当开大一些。
20260803
A,B 签,均可线性,注意卡常。
C 显然是 \([1,i]\to i\),\([i+1,n]\to n\),最后合并 \(i\) 和 \(i+1\),于是考虑枚举边,分出的两个子树分别求无根树的拓扑序(换根 dp \(O(n)\)),乘法合并。容斥掉二度点算重的情况。签。
D 单侧递归线段树板子,签。
20260805
A Gym106440E 注意到决策单调性,于是可以分治求出决策点。
B 离散化后权值线段树二分,签。
C 考场上访问非法索引(-1)挂分了,-Wall 没查出来。所以应当进行更多测试与检查。\(O(nk)\) 做法是枚举插板方案。注意到只需要 \(O(\log n)\) 个点值,可以做到 \(O(k\log n)\)。注意到点值是 \(\lfloor\frac n{2^k}\rfloor,\lceil\frac n{2^k}\rceil\),于是可以做到 \(O(n)\)。
D P12019 考虑使用单调栈维护出所有边界为 1 的极小矩形,角落可以为 0,实现比较复杂。然后使用延迟删除可删堆 + ST 表 + 扫描线实现二维 chkmin,总复杂度 \(O(n^2\log n)\)。
20260809
又打成区了。
A UOJ1034 结论题。注意到 Alice 很容易赢。当 \(\lfloor\frac{n}{k}\rfloor\ge 3\) 时,Alice 可以进行二部图染色,染色较小的一边后,Alice 还有一次染色机会,Bob 至多再走一步,Alice 胜。当 \(\lfloor\frac{n}{k}\rfloor=2\) 时,至多可以进行两轮游戏。注意到 \(Bob\) 在两轮游戏中经过的两个点至少需要满足度数 \(\ge k+1\)。我们称满足这个限制的点为关键点,则关键点数量 \(\le \lfloor\frac{2n-2}{k+1}\rfloor\le \frac{2n-2}{k+1} \le \frac{2n-2}{\frac{n}{2}+1}<4\),于是至多有 \(3\) 个关键点。\(k=1\) 时 \(n=2\) 显然 \(Alice\) 胜,进行简单的分类讨论就会注意到 Bob 在 \(k\ge 2\) 时可以被堵死至只剩一个关键点(起点),于是至多只能走一步,Alice 就会胜利。当 \(\lfloor\frac{n}{k}\rfloor=1\) 时,Alice 必须开局杀 Bob,也就是要求起点度数 \(\le k\)。综上所述,Bob 获胜,当且仅当 \(k>\frac{n}{2}\) 且起点度数 \(\ge k+1\)。
B 数学。考虑通过把一棵树拼接到根的最后一个儿子来不重不漏地计数,状态转移只需考虑原树本身与原树与拼接子树交叉分别产生的贡献。再简单调整上下界可以做到 \(O(n^2\ln n)\)。
C P13341 构造一些方案:12 出 1,18 出 3,16 出 4,15 出 5,14 出 7,13 出 13,18 出 15,16 出 28,21 出 35,然后背包。
D P12559 快进到忽略二进制最高位非最大的元素,减去剩余元素二进制最高位,求 \(\min_c(c+\sum[x>c])\)。转化成求 \(\max_c(\sum[x\le c]-c)\),这是 Hall 定理推论的形式,于是逆用之,把左部点视为所有数组中的元素,右部点视为 \(1,\dots\),每个点向 \(1,\dots,x\) 连边,则此式即为最大匹配下左部点失配个数。显然可以以任何顺序贪心匹配选择可选最大点而无需反悔,由于每一次查询最优化一个前缀的后缀,考虑按 \(r\) 扫描线让每一个后缀匹配最大化。每一次 \(r\) 右移,我们可以使得至多一个左端点失配,为了达成最优化目标,这个左端点应当是 \(a_r\) 的支配范围中下标最小的,设其下标为 \(i\)。然后,它会为当前 \(r\) 以及后面的 \(r\) 在 \([1,i]\) 的答案带来 \(1\) 的失配贡献。这些都可以用线段树维护,至于强制在线则由主席树维护答案贡献。这里可以不用主席树前缀加单点查,可以考虑单点作为失配点贡献主席树统计前缀贡献,也就是主席树单点加前缀查,常数小一些。精细实现可以做到 \(O((n+q)\log n)\)。
20260811
又打成区了。
A 设 f(i,j) 表示前 i 位凑出 \((\lfloor\frac{n}{2^{k-i}}\rfloor+j)\times 2^{k-i}\) 的最小次数, \(g(i,j)\) 为对应方案数。注意到单个偏移超过 \(4\) 一定不优,\(j\) 取 \([-4,4]\) 即可。时间复杂度 \(O(n)\)。宁愿多一些冗余也不要写大分讨。
B 反常 Nim 游戏结论:反常 Nim 游戏中,状态 \((a_1,a_2,\cdots,a_n)\) 是必败状态 \(\mathcal P\),当且仅当
- 存在 \(i\) 使得 \(a_i>1\),且 Nim 和 \(a_1\oplus a_2\oplus\cdots\oplus a_n=0\),或者
- 对于所有 \(i\) 都有 \(a_i\le 1\),且剩余的非空石子堆数是奇数。
因此吉司机线段树维护区间异或和与 \(1\) 的数量即可。
C 两种做法:离线+点分治+线性基,时间复杂度 \(O(q\log n(\log q+\log^2\omega)+n\log n\log\omega)\),空间复杂度 \(O(n+q\log\omega)\);在线+点分树+前缀线性基,时间复杂度 \(O(q\log n\log^2\omega+n\log n\log\omega)\),空间复杂度 \(O(n\log\omega)\);在线+点分树+线性基,空间复杂度 \(O(n\log n\log\omega)\),会被卡飞,NOIP 没有 selfeval。
D 使用矩阵套二元多项式维护朴素 dp 带修转移,复杂度 \(O((n+m)\log n2^3p^4)\),记得把矩阵乘套多项式卷积展开卡常,否则要 \(2048\) 次标量乘法。
20260815
A 易。
B QOJ14808 维护 border 然后随便推一推,易。
C 建 Kruskal 重构树,然后建虚树,可以拿到 60~80pts。正解需要注意到可以用积分得到一个答案的下界,并且注意到这个下界是可构造的,于是容易实现。
20260817
A P14536 易。
B P16368 奇偶性相同才有解。考虑最大间隔是我们要保留的。构造方案是容易的,移到最大方案后在每一个中点处删除即可。
C P14447 显然用攻击力最大的干掉其他所有的,然后只需要考虑它能不能被干掉。显然一定是一个链式转移,起点是一定干不掉的任意一个,终点是攻击力最大的,转移条件是能干掉即 \(A_i\ge B_j\),于是拍到数轴拍成 \((B_i,A_i]\) 维护,查询没被干掉的攻击力最大的和全局攻击力最大的 \(i\) 区间 \((A_{\max},B_i]\) 是否被全覆盖即可。
D QOJ9800 神题。倒序转移,开始状态只有为 0 的单点,每次转移可能是不变(区间内有 0)或向左/右拓展(区间内没有 0,去找最近的 0)。注意到这样贪心拓展状态数是 \(O(n)\) 的,因为有效状态一定没有严格包含关系。于是状态数是 \(O(nm)\) 而不是 \(O(nm^2)\) 的。最后再进行一次 \(O(n)\) 的 dp,大概设计成每一位当前这里没有人,或者有人往左/右走去区间。
20260819
A P17270 先 Dilworth 掉全不合法。然后考虑极长连续区间,一定会被划分成固定的两条链,链长分别为 \(c1\) 和 \(c2\)(\(c1\le c2\))。于是起始位置预先偏移 \(c1\),背包里放一个 \(c2-c1\),做可行性 dp 即可。用 bitset 优化并平衡块长,可以做到 \(O(n\sqrt{\frac{n}{\omega}})\)。
B P17271 显然删叶子。直接 \(O(n^2)\) 做有 57 分。要关注到的第一个性质是,一个合法的删叶子序列是 dfn 倒序。第二个性质是,可以通过记录每一个被删除节点的 size 优化 \(O(n)\) 的邻域查询为 \(O(deg)\)。于是稍微分析一下就可以知道操作上界不到 \(3n\),可以通过。
C P17272 易。
20260820
A P17273 超级分讨,实际上注意到只需要位置最大和最小的元素可能好做点。也没差多少。
B P17274 超级构造,大众分跑路了。
C P17275 超级容斥,没调出来。赛后发现编辑距离 \(<100\) Bytes。细节能力还是太不好了。
20260821
A QOJ18310 签。
B QOJ12561 考虑二分答案可以求出取特定数量的物品的最大价值,于是可以先贪心取满正收益,再判断一下 val 贡献左右端点会不会更优即可。
C QOJ15496 二分答案,MIN/MAX 变为了布尔串 OR/AND。于是考虑维护极长 01 段,使用桶和全局偏移量维护,清空桶删除元素时要合并前后节点。注意特殊处理首尾。
D QOJ17745 先特判 \(n=0\)。然后用线段树预处理每一个前缀中的数作为序列结尾时最长序列长度 \(f_i\),然后 \(g_i=\max_{|i-j|\le k}f_j\),每一个 \(g_i\le t\) 的极长连续段贡献为 \(\left\lceil\frac{len}{k+1}\right\rceil\),把 \(g\) 处理成区间常值函数笛卡尔树分治每次乘上带权的贡献就做完了。
20260823
A 从交换标号入手,相遇交换标号,因此必然是从原牛开始向原方向-反方向-原方向-……这样地变化,用二分法找到在 \(t\) 时间后标号 \(c\) 被交换到哪头牛上了。实现时不用把牛看成环,可以看成无限延伸的链。
B 神秘随机化题。
C 糖。卡常时注意 constexpr 比 define 快。
20260824
A 回忆 Kruskal 的流程,考虑从小到大枚举边权,那么两个端点的点权都必须是边权的子集。于是考虑每个点权向比它恰好小 \(1\) 个位的点权连边,如果不存在则将对应点权“增广”到自己,这样做的正确性显然是有保证的。
B 神仙构造题。要求构造一个点数不超过 \(500\) 的初始状态为 \(0\) 的有限状态自动机,状态转移函数接受一个在 \([0,n-1]\cap\mathbb Z\) 上服从均匀分布的随机值作为参数,转移到代表 \([0,m-1]\) 的终末状态的概率相等,并最小化期望转移次数。我们考虑把转移树画出来,假如当前层点数 \(C\) 第一次不小于 \(m\),那么显然前 \(\left\lfloor\frac{C}{m}\right\rfloor\cdot m\) 个元素每组 \(m\) 个元素被转移到概率相等,直接转移到终末状态即可。剩下 \(C\bmod m\) 个元素则可以继续转移。于是我们设点数为 C,当前“数值”为 \(V\),随机数为 \(r\),转移就非常简单:
状态数是 \(\frac{30\times 31}{2}=465\)。感性理解一下确实是期望转移次数最小的。
C ODT 板子,按 \(r\) 从小到大扫描线,用全局树状数组维护一下最后访问时间在某个后缀区间中的点的数量。
20260926
AB 签。
C 考虑分治,然后是容易的。
D 考虑 P2048 固定左端点,右端点 RMQ 区间分裂,用堆维护的思路,可以类似地求出 topK 大/小子段和,然后再用堆进行多路归并。
20260927
A 可以猜结论,证明稍难,签。
B BEST 定理快进到求基尔霍夫矩阵的行列式。
设 \(S=\sum_{i=1}^n a_i\)。矩阵 \(A\) 可写成
其中 \(J\) 是全 \(1\) 矩阵,\(a=(a_1,\dots,a_n)^T\)。删去第一行第一列后得到的矩阵记为 \(B\),大小为 \(m=n-1\),索引为 \(2,\dots,n\)。令 \(a'=(a_2,\dots,a_n)^T\),则
再令 \(C=nI_m+S\operatorname{diag}(a')\),则 \(C\) 是对角矩阵,对角元为
于是
其中 \(W=[\mathbf 1,a']\) 是 \(m\times 2\) 矩阵。由矩阵行列式引理,
计算 \(W^T C^{-1}W\) 得到 \(2\times 2\) 矩阵
其中
因此
这就是删去第一行第一列的子式 \(M_{11}\)。
C 恶评为 3500 的,实际很简单。二分第 \(k\) 大价值,用 ODT 和树状数组维护每个区间段最晚覆盖时间,然后双指针即可,统计答案过程类似,复杂度是 \(O(n\log n\log V)\) 的。注意到每次 check/calc 树状数组上的单点修改都是一样的,而且你 query 的位置一定单调往右,所以精细实现一下就能做到 \(O(n\log V)\)。
D 考虑时光倒流之后整体二分算答案。维护每个点最早可能被缩的时间,每次分治按时间阈值分类,把左边缩点,然后左边的被缩的边答案在左边,没被缩的边答案在右边,答案在左边的递归,答案在右边和本来就在右边的重标号后递归。

浙公网安备 33010602011771号