没有参加 NOI2021 捏,所以题面都是贺来的!
看神仙打架真好玩!
懒得组织语言了所以所谓题解都是一大堆支离破碎的 observation
Day 1
T1 - 愚蠢的在线法官 by pjq
题目大意.
给出一棵树(点有点权 )和一个节点序列 ,请你求出
。
- 如果有重直接返回 。否则可以按任意顺序 sort。当然取 DFS 序最为舒适。
- 如果 选了 ,就画出路径 。每条边不会被同向经过两次。(否则可以交换两个点的目标,这会反转符号并抵消,类似 LGV 引理。)
- 于是有显然的 DP,每个子树只有两种状态:需要一条边进且需要一条边出;或自给自足。
T2 - 这是一道集训队胡策题 by xym
题意.
给出一个 的 01 矩阵 ,求有多少长度为 的 01 序列 ,满足 。答案对 取模。
。
可见,我们所要满足的就是
怎么看怎么不能算!
关键在于,由于上式必定 ,于是它等价于
自然也等价于
枚举 中 的个数和 中 的个数即可。( 只需要取最大值)
T3 - 树上的孤独 by lbc
题目大意.
有一棵大小为 的树 和一棵大小为 的树 ,每个点都有一个颜色。
你要支持两种操作:
。
离线求出:在 上,每个点,每个颜色离自己的最近距离(最小 dep)。线段树合并即可。。
实在太小了,没有什么特别好的办法。现在的问题就是对 中变得合法的每一种颜色,确认它是否在 也合法,实际上我们可以大力求它在 中离 的最近距离。这样还可以支持那个迫真在线,非常舒适。
现在我们拆出了 个询问。这东西是可以离线的,那我们也就没必要在线段树上苦痛,直接 dsu on tree 就好。
Day 2
T1 - 序列 by ztr
题目大意.
现在有一个未知的、长度为 的、元素皆是 中的整数的序列 。现在有一些信息,形如: 的中位数的值是 。
请你构造一个符合条件的 ,或者报告无解。
。
构造 2-SAT:
。
对于一条信息 ,
- ,其他组合同理。
可见有意义的总点数为 个。跑一跑即可。
T2 - Imbalance by yg
题目大意.
问有多少个 构成的序列满足:
- 其前缀是一个给定的串 ;
- 所有长为 的子串元素和皆不为零。
。
先不考虑 。
对于 ,显然是 sb 题。
对于更大的 ,可以看成是在一个周长为 的圆柱上游走,问有多少不与自身相交的路径。此时周期数不超过 ,大力爆枚每个周期的起点()然后大力 LGV()即可。
如果考虑 ,上面的做法依然适用,只不过难写一些。
T3 - 学姐买瓜 by zjr
题目大意.
次操作,每次操作形如:
- 加入一个关键区间 。
- 询问:考虑 的所有子关键区间,问最大不相交区间数。
。
考虑求最大不相交区间数的那个贪心,你会发现加入一个区间的效果就是区间改父亲。珂朵莉树 + LCT(LCT 上的一个点表示一群父亲相同的点)即可。
Day 3
T1 - Lovely Dogs by cxr
题目大意.
定义函数
现在有一棵树,点的编号恰是 的排列。你要对每个子树 求 。
。
基本的思路是 dsu on tree。
考虑容斥,记 ,所欲求的就是
为了迎合 dsu on tree,我们把这玩意化成某个固定的 产生的贡献的形式:
事实上我们可以只枚举 :如果 不整除 又有最后一个条件成立,那么直接有 ,这种 是可以直接忽略的。
故时间复杂度为 。
T2 - Alice、Bob 与 DFS by zlm
真·明哥题
题目大意.
现在有一个 DAG,每个点的出边被认为有序。每个点要么是黑点,要么是白点。
有 个程序,形如:从 ( 不一定全相同)开始进行 DFS。
- 对于黑点,程序会无条件地依次访问其出边,并递归搜索;
- 对于白点,程序会在访问每条出边前询问是否跳过该出边;
- 所有程序在对某个点的搜索开始前会自动暂停。
一开始,所有程序均处于开始搜索起始点前的暂停状态。
有两名玩家在进行博弈。双方轮流进行以下操作,不能操作者输:
- 选择一个搜索过程尚未完全结束的程序,将其从暂停状态中恢复;
- 继续执行该程序,在程序将要访问白点的出边时决定是否跳过该边, 直到该程序完全结束或再次暂停。
双方均采取最优策略。判断先手是否必胜。
。
下面认为遍历边的顺序是从左至右。
先来考虑【所有点皆为白点、该 DAG 是一棵外向树,起始点总是外向树的根】的简单情形。
此时,dfs(x) 的后继状态是:
- 的儿子们;
- 的右兄弟们;
- 的右兄弟们;
- ……
- 失败状态。
设 的子树在 DFS 序中是 ,实际上 的后继状态就是
直接求个 SG 函数即可。
现在试试推广到【所有点皆为白点、DAG 不必是外向树】的情况。此时一个状态可被一组自 开始首尾相接的边描述。自然,这时状态数太多了无法承受。
我们已经知道某状态的后继状态由两部分组成:
后者只依赖于当前节点 。我们尝试把前者黑箱化为一个集合 。设这时的 SG 值 集合 为 。
显然,设 的儿子们为(从右至左),有
……是啊,确实很显然,但是好像没什么用啊?
下面开始高端操作了!记 为 中第 个未出现的元素。显然,。我们断言,【 必可表为 】。事实上,你只需要注意到:
就可以归纳出刚刚的结论了。其实我们还可以得到(一层一层嗯展开)
只需要求出 (其实,显然,它也直接是从 开始 dfs 的答案)。用树状数组优化的暴力转移已经可以通过。
最后一个问题,【黑点】。不难发现:
- 黑点的存在实际上否定了自己除最右的儿子外回溯到 的可能性,让它们只能回溯到自己的下一个兄弟。即
- 对于一个黑点 , 要么为 要么为 。
于是是容易判断的。实际上,更进一步,黑点的 只有以下四种可能:
而当我们再回头查看白点时,我们发现黑点的存在破坏了之前归纳得出的结论。或许可以考虑修正一下?
注意 中大于 的元素不会影响黑点 的取值,因此我们只需要对四种情况分讨即可。事实上更近一步有
T3 - 音符大师 by dyp
题目大意.
你有两只手,宽度均为 ,一开始均处于 。
现在有 个音符依次出现在 处,你要移动你的手来保证每次音符出现时都被至少一只手覆盖。手从 移动到 不需要时间,但需要代价 。问最小移动代价。
。
考虑这样一个 DP:手分别在【 或 】(用一个 变量记一下)和【 或 】处,下一个音符是 。
转移时这样考虑:
- 先用当前的两只手接一段音符;
- 把手移到【 或 】,接一段音符,直到 。
因此,如果我们找出第一个接不住的音符 ,那么 的取值就只有 种了。(因为必须接得住 )
当然,它不够快。
我们对每个 开一个线段树,里面维护 的 DP 值。
考虑第一个 接不到 的元素 ,它可能能被 接到也可能不能接到,如果是前者,那么 的取值极其有限,暴力转移即可;如果是后者,则可以批量转移上去(需要支持线段树合并)。
时间复杂度 。
Day4
T1 - 基础图论练习题 by djq
瑇
unavailable yet
T2 - 机器 by ckw
线性规划全家桶!
题目大意.
给定一张有向图,点有点权 和 个入管道、 个出管道。如果 可以到达 ,那么任意 的入管道就可以和任意 的出管道匹配,并获得权值 。最大化总代价。
。
忽略点权,全部加到 上。有显然的网络流模型。
自然写出线性规划:
我们把一个点上从 连来的边 / 连向 的边作为一个整体考虑。
具体来说:如果固定它们对流量的影响(即固定从 进入 的流量 - 从 进入 的流量),那么对【边们各自是否满流】的选择是唯一且可以预先处理的。更近一步,它对权值的影响是上凸的。
因此我们把线性规划重写为
以下细节值得注意:
- 我们处理凸包形贡献的方式。
- 注意与源汇相连的边的流量已经算进 里了, 是原图中边的流量。
- 注意我们直接让 的范围没有限制;实际上我们是通过调整 使得超过范围的 贡献为 来起到限制它的效果的。
自然,把 写开:
转成对偶:
故技重施:当 确定时, 的最优选择是可以确定的,而且对贡献的影响也是一个凸壳。即,该线性规划可以写为
这是一个与 保序回归 问题几乎相同的问题:所有定义和证明都可以搬过来(除了 均值要改成凸包上的最低点)。我们只需要跑 log 次最大流(整体二分的每一层一次)即可通过。
T3 - 数列重排 by gyh
题目大意.
现在有 个数,保证 出现的次数是 之一。
你要对所有 求出:若把这些数随意排列, 的区间个数最多可以是多少。
我们称 的元素为白球, 的元素为黑球。可见黑球并不影响 。
我们来考虑怎么排列白球。直观地想,肯定是形如 。如果有出现 次的元素,那就尽量把它们放到每一个周期的开头,让整个序列形如 。
暴力打表可以发现这是对的!
那么现在的问题就是怎么插黑球。定义一个黑球的贡献 是以它为开头 / 结尾的区间数。
自然考虑调整法:
- 如果某个黑球和左端点无贡献,可以把它移到最左端。右端亦然。
- 如果两个黑球中白球数 ,那么把其中 较小的移到 较大的旁边一定不劣。
因而,(结合打表的结果),我们猜测:答案形如
此时,我们发现贡献总和形如
黑球对白球的贡献 其中 是连续段长度。
由此,接下来的分析就很简单了。结论为:前 个黑球平均分配于两端,之后的黑球对每个黑球段平均分配。
Day5
T1 - Speike & Tom by wcz
ix35 哥哥,你就不能少整点这种活吗
unavailable yet
T2 - 聚会 by wwc
题目大意.
请用一堆三元环完美覆盖 的每一条边。
。保证 或 。
保证:只要 满足以上条件就必定有解。
Welcome to the Sacred Order of Steiner Systems
直接丢 ppt:这里
T3 - 细菌 by zzh
题目大意.
现在有一个 的立方体,你要从指定位置开始游走 步:每一步可以让任意一个坐标 。
问,有多少路径始终没有游走出边界。
。
先考虑一维的情况,记起始坐标为 。对于高维只需要把三个方向卷起来。
我会 !直接 DP!
想想别的做法?
考虑容斥掉那些接触过左/右边界的路径。接触过左边界的路径数为
反射容斥 但是这样会把那些又接触了 L 又接触了 R 的路径数重!那么再数 LR/RL/LRL/RLR……这种东西不会超过 个!……但是好像不好算?
理一下思路。以上问题可以描述成:
从原点开始向右向上走,且不能越过 和 的路径有多少条?
考虑终结于特定的 的路径:我们已经知道它是不超过 个组合数。
然后考虑全体路径。对于大部分的【当前位置】,向上向右都是可以走的;只对于 个【边界位置】,我们需要进行容斥。所要容斥掉的其实就是上一个问题的答案。
所以复杂度是 !
两个结合起来根号分治一下,于是就过了。