英才集训(野 *史*)

Day 1

考试。

T1 是神秘构造题,让我们构造一个双射 \(f\),使得 \(A\subseteq f(A)\),其中 \(|A|=n-1,|f(A)|=n\)。两者元素均在 \([1,2n-1]\) 之间。

然后好像用 Raney 引理就可以构造出一个双射:假设 \([1,2n-1]\) 是一个环,然后假设选过的值是 \(+1\),没选过的是 \(-1\),这个序列的最后一个最大值最保证了其在这里开始的循环序列满足该点就是唯一前缀最大值,所以存在一个双射 \(A\to A\cup\{maxpos+1\}\),因为 \(maxpos+1\) 处为负,没选过,然后加入一个 \(maxpos+1\) 之后这个序列仍然存在唯一前缀最大值且比原最大值大一。观察其形态不可能由其他的任何函数经过上面映射过来,所以这是一个双射。

T2 看不懂。

T3 就是发现对于一个连通块,我们的罚时次数只有两种可能:\(A\)\(A+1\)

一个 trival 的想法就是发现对于所有 \(O(k)\) 个集合,它前面其实都对于到根路径模 \(T\) 有一个分界点,两侧的罚时次数分别是 \(A\)\(A+1\)。最多有 \(k\) 个分界点,所以每个集合可以分成 \(O(k)\) 个等价类,每个等价类里面的对于其他集合的罚时次数都是一样的。暴力维护这个东西 + 暴力合并 同集合的 子树 对于其他集合的 罚时次数的 集合就是 \(O(nk^2+qk^2)\) 的,然后如果利用上 \(A\)\(A+1\) 的性质状压(这里需要使用每个同色连通块到其他集合的罚时次数了)一下可以把空间从 \(O(nk^2)\) 压到 \(O(nk)\)

原题 CF1621H,我觉得看代码或者某些人的题解会更好理解。

Day 2

考试。

T1 人类智慧过了。

T2 很神秘。好像是数学书原题。

T3 推式子 + 多项式板子好像是,史。

Day 3

讲课。

写了一天的 FFT 学习笔记,结果写了一大部分三角函数和差角公式的证明,我还是太菜了。

Day 4

考试。

又是什么都不会的一天。唉。

T1 小丑了。出现个数从小到大枚举字符集。第一次二分,第二次直接枚举每个间隙,第三次同。用了 \(2n-\max_{p\in \Sigma}(cnt_p)+3\log R\) 次询问。

T2 网络流黑白染色,但是没做过无限之环,再次小丑了。原题 BZOJ4261。我直接贺一个别人的题解了。

\(S\) 到每个黑点的控制点连边,流量 \(2\),费用 \(0\)

控制点向两个方向的点各连两条边,第一条流量 \(1\),费用 \(0\),第二条流量 \(1\),费用 \(w\)

然后两个方向的点分别向对应白点连边,流量 \(1\),费用 \(0\)

这样一来如果这个格子是直轨道,那么会产生 \(w\) 的收益,如果是弯轨道,会产生 \(2w\) 的收益。

对于白点也类似处理,求出最大费用最大流,如果满流则有解,最大收益为费用减去总收益。

补充:就是把点拆成该位置,该位置水管的横点和竖点。

感觉这个建图非常巧妙。

中间那个 \(w_{i,j}=0\) 的 sub 可以黑白染色,然后每个点拆成四个点上下左右,对应匹配,然后保证流过这四个点的流量为 \(2\) 即可。

考试的时候想到过网络流,但是还是被 \(m\leq 30\) 这个范围被骗去想状压和 meet-in-middle 了/xk。

T3 神秘题,不会。好像前面用 Hall 定理和差分约束很好使,加上离散化后能做到 \(O(n^3)\),但是后面那一坨就不知道了,说是要什么神秘的线段树优化。

感觉考试考少了,都不知道考试的时候该干什么。

Day 5

抽象考试。全部不会。

T1 感觉把分治考透了,非常好。

首先 DP 方程式是:

\[dp_{i}=\sum_{j<i}\left[\max_{k\in [j+1,i]}(lim_k)\leq i-j\right]dp_{j} \]

然后 \(O(n^3)\) 就能直接过 20p。

看到区间限制,还是 \(\max\) 这种非可差分的东西,所以我们想到分治。

考虑在区间 \([l,r]\) 中划一刀 \(mid\),然后我们利用类 CDQ 分治优化 DP。

拆限制:这个时候限制变为 \(\max(Lsufmax_{l},Rpremax_{r})\leq r-l+1\),然后这个东西显然能把 \(\max\) 拆开:

\[\Rightarrow Lsufmax_{l}\leq r-l+1\ \ \ \land\ \ \ Rpremax_{r}\leq r-l+1\\ \Rightarrow r\geq l+Lsufmax_{l}-1\ \ \ \land\ \ \ l\leq r-Rpremax_{r}+1 \]

这是一个二维偏序的形式,贡献为 \(dp_{l-1}\to dp_{r}\)。这样把单次 DP 的复杂度降到了 \(O(n\log^2 n)\)。可以获得 70p。

二维偏序都不知道怎么写了,我真的是太菜了,写的东西常数巨大,唉。

然后考虑如何计算 \(lim_i=1\) 的情况。我们考虑按上面的方法计算前后缀的 \(dp\) 值,然后设前缀 \(dp\) 值为 \(f\),设后缀 \(dp\) 值为 \(g\),那么我们可以列出用 \(f\)\(g\) 表示中间 \(lim\) 有改动时答案的式子:

\[\sum_{l=1}^i\sum_{r=i}^n\left[\max_{k\in[l,r]}(lim_k)\leq r-l+1\right]f_{l-1}g_{r+1} \]

是一个类似于上面我们分治处理的式子的式子,只不过贡献类型和维度不一样。

这次我们就不是 DP,我们来类似于处理一个 把某个点的 lim 变成 1 后的答案是什么 的询问,我们仍然使用分治。

考虑某个 \(lim\) 变成 \(1\) 后的变化。

我们同样先对于一个左侧点,计算它变成 \(1\) 后变化了哪些贡献。显然我们分治就是为了计算跨过中点 \(mid\) 的贡献,而这样贡献的式子就是于左边的后缀最大值有关。所以如果修改的是左侧的维护单调递减序列的单调栈上的元素才有可能发生贡献的变化。我们发现这个变化就是在单调栈左边一个点到该点可能产生,所以我们重新计算这个区间的贡献,然后把这个变化加到该点上。又是基本一样的二维偏序。

我们发现只计算左侧贡献是未计算完整贡献变化的,考虑对右侧如法炮制即可(为了计算对左侧的贡献)。

总时间复杂度 \(O(n\log^2 n)\),可以通过。

没时间写 100p 了,先放置吧,唉。

UPD on 2024-04-04 01:18:md 终于在半夜调出来了。

T2 神秘组合题,放弃补题。

T3 DS,感觉上思路没有什么难点,但是当天考试晚上因为明天放假的事破防了,先放置吧。

Day 6

差点误车/fn。

Day 7

又 tm 一题不会,最后暴力费用流单纯形板子还写挂了。

T1 DS。看懂之后认为自己写一遍价值不大,于是先贺或放置。

我们首先来看怎么得出答案。

对于一个点 \(x\),假设其邻域最大值为 \(pmax_x\),那么如果这个值 \(pmax\) 值小于 \(\frac{sum_x}{2}\),那么我们就一定能找到一组匹配,使得在这个点最多停下 \(sum\bmod 2\) 次。如果大于等于,那么情况就有点变化,这个最大值以外的所有邻域全部都要用来匹配这个最大值,而仍然会出现最大值未匹配完的情况,所以这里这个点就要停靠 \(pmax_x-(sum-pmax_x)\) 次,即 \(2pmax_x-sum\) 次。最后的答案就是:

\[\sum_{x}w_x\max(2pmax_x-sum_x,sum_x\bmod 2) \]

考虑在有询问的前提下怎么维护这个东西。

考虑重链剖分。每次修改一个路径的时候我们分几种情况讨论。

首先是特判链底,LCA,和轻边。

然后是重链,我们不难发现其实如果最大值在邻域的重边上,那么我们对于修改该重链的时候,我们对答案影响的值变为了 \(2(pmax_x+z)-(sum-2z)\),不变!所以我们把最大值在邻域重边的点称为一类点

这个时候我们初始化的时候就要预处理出来这个一类点了。对于修改一个轻边的父亲,我们发现这个东西可以把一类点变为非一类点,维护这个点最大的 \(2pmax_x-sum_x\),一次最多删 \(O(\log n)\) 个一类点。

那么我们对于一类点不需要任何操作,但是对于重链上的非一类点,因为重链上的加,它有可能从非一类点变成一类点。但是每次操作最多删除 \(O(\log n)\) 个一类点,那么均摊下来,加入和删除的一类点个数均为 \(O(q\log n+n)\) 个。所以我们可以每次暴力找出这些非一类点。如何找出来呢?不难发现一次加 \(z\) 对这个最大值的影响是 \(-2z\),所以我们用线段树维护这个操作。我们可以维护 \(2pmax_x-sum_x\) 的最小值,然后我们直接遍历这个线段树,把所有这个值小于 \(0\) 的数找到,因为这些点从非一类点变成了一类点。然后记录下来,最后把这些位置直接赋值为 \(+\infty\)。如果存在一些点从一类点变成了非一类点,那么线段树上的信息依然需要改动。

因为一类点和非一类点的转化次数 \(O(q\log n+n)\) 的,而剩下的非一类 \(\to\) 非一类本来就要修改,贡献可以顺便修改。所以对答案的统计都可以在进行上面操作的时候顺路修改了。

需要额外用一个数据结构维护单点值(单点查,链加)。

总时间复杂度为 \(O(q\log^2 n)\)

不想贺了。

T2 生成函数,跳过。

T3 神秘 DP 三分凸优化,爆炸,估计看不懂,而且时间也不够。

md,谁 tm 想出来的什么都没学完就开始考神秘试,这种情况谁 tm 在没有基础的情况下能补完题啊/fn/fn。

下次再遇到这种情况我就直接暴力 2h 之后下播去整 FFT 了,没有商量的余地。不会就是不会,没学就是没学,不可能补题在没学或没见过几道这样的题的基础上能补的很快。之前的人是之前的人,我们是我们,他们能补完或者甚至有自由安排的时间,但是不代表我们有。而且我们也不能活在他们的轨迹里。

Day 8

T1 构造,好像可补。

玄学调整法。

首先有威尔逊定理:

\[(p-1)!\equiv -1\pmod p \]

所以当我们需要构造 \(p-1\) 组结果非 \(0\) 的数时,所有数的乘积为 \((p-1)!^2\),它在模 \(p\) 剩余系下的结果是 \(1\)。这是判断无解的一个条件。

当然,如果有 \(>\) 两个 \(0\) 存在在 \(a\) 数组,那么我们一定能知道无解,因为 \(v\)\(t\) 只有两个 \(0\)

先特判 \(0\) 的情况。

我们使用玄学构造法,每次随机一个非零没选过的 \(x,y\)\(y\) 是备用数),令 \(v_i=x,t_i=a_ix^{-1}\),我们发现只有可能 \(t\) 有重复。设之前重复的位置是 \(j\),我们再递归 \(a_j\),其中构造 \(y\),备用数是 \(v_j\)。因为一定有解,所以我们可以知道不会产生循环,时间复杂度则是 \(O(n^2)\)

但是随机是玄学,据说可以期望做到 \(O(p\log n)\),但是顺序选的暴力 \(O(n^2)\) 就已经过了,因为这个东西和 Dinic 一样跑不满。

但是这样的话对于我们最先说的那种无解条件就会有数已经选完了,但是还要选一个备用数的情况,所以可以先删一个 \(a_n\),最后遍历找最后一组匹配是什么。

T2 虚树 + 根号重构,我不指望我今天能学完这两个东西,放置。

T3 Lyndon 分解 + 生成函数。更为唐氏,放置。

Day 9

完了,神秘预估的症状来了,马上就要成唐氏儿了。

面積比の公式言えますか?子供の時の夢は言えますか?その夢すら溝に舍てたのは,おい誰なんだよ もう知ってんだろ!

T1 智障了,没有想到数据点分治。

就是问一个数的质因数能不能线性组合成另一个数,多测。

这是显然的同余最短路,时间复杂度 \(O(\sqrt k\log k\log(\sqrt k\log k))\),分解质因数的时候需要枚举质数而不是枚举所有数,单次复杂度为 \(O(\frac{\sqrt k}{\ln(\sqrt k)}+\ln k)\),但是这道题需要有 \(3\times10^7\) 个点,于是想到数据点分治,只有两个质因数的时候 exgcd 判,一个的时候直接判整除。这样我们就把这个东西降到了 \(10^5\) 个点。

居然是道黑题,但是需要用 __int128,不能在洛谷上交/fn。

UPD:现在可以直接交了,CF 上的题要特判 \(k=1\)

T2 有点博弈论的味道。

场上再次小丑,没见过线段树维护复杂标记并且维护的是 DP 的转移的题/xk。

我们不难发现对于一个数,如果是偶数,棋子第一次到达该点的时候为奇数,那么这个点最多停留奇数次,而停留奇数次就交换了先后手,所以到达该点的时候,此时的先手可以决定这里他自己是先手还是后手,因为显然这个东西有必胜策略,所以这里既然他能决定自己是先后手,那么他必胜。所以棋子到达偶数的时候无论后面或者前面是什么数此时的先手都必胜。

棋子到达奇数的时候除非后面 \(m\) 位都是先手必胜,这里才能先手必败,否则一定先手必胜。(场上就在这里卡住了/xk)

我们对于每一个区间记录如果最近的一个先手必败离这个地方还有 \(1\sim m+1\) 的 DP 转移。转移则转移成区间左端点前面那个点最近的先手必败还有多少步。然后发现这个东西对于两个区间可以 \(O(m)\) 合并。

区间修改可以理解为二进制翻转,用线段树两种信息,修改时交换信息即可。

那么我们就可以在 \(O(mq\log n)\) 的时间复杂度内解决这个问题。

合并标记的时候有 inf 个细节,注意我们钦定当作为值的最近先手必败距离为 \(m+1\) 时此时先手必败。初始化标记的时候也有 inf 个细节,主要注意只有作为下标的最近先手必败距离为 \(m+1\) 是需要讨论的。

T3 神秘 DP 计数。放置。

Day 10

FFT。

Day 11

T1 纯小丑,每个点维护其儿子的和就完了。Hanghang 题解的重标号复杂了一点。

T2 分治 NTT+min-max 容斥,再见。

T3 苹果的科技,再见。

话说我承诺过讲 DP 的时候把苹果场的所有 DP 都讲一遍,我一定会实现的。不过集训完之后我就要课件启动了,我是觉得必须要讲课的那一类人,因为我课上可能都讲的是简单题(自称:DP 口胡风暴),难题过 5min 直接讲,剩下的就是苹果题了。不过肯定有博客的。我要做两周的东西,所以比较麻烦,虽然我觉得 DP 优化不用讲。

场上居然没做出 T1,我可能 DS 还是练少了。虽然在多项式,但是可能还是需要把我 rand 出来的题库给做了。

Day 12

倒数第二天,终于要结束了,鬼知道我们之中有几个人在认真考试。

T1 场上考拉爆了 sol 的算法,然后让我灵光一现,虽然本质一样,但是考拉三分,我二分。考拉下次能不能别爆 sol/xk。

就是期望 DP 推式子 + 二分断点。我也不知道为什么要三分,好像是答案有单调性/jy,这样能做到 \(O(log^2)\)

T2 一会儿再看,好像是之前考到的一个 trick,但是我没补。

T3 DP,感觉这个限制状态数的 trick 非常妙。

首先我们显然只关心 Alice 和 Bob 目前最后一道题的完成时间差了多少,而我们每次删掉的元素又一定左右端点上的元素,所以我们设状态 \(f_{t,l,r}\) 为当前 Alice 减 Bob 的最后完成时间为 \(t\),区间 \([l,r]\) 内的元素还没有被删,用最优策略走出来 Alice 的时间。

显然有暴力 DP,判断 \(t\) 的正负来知道目前该谁选,时间复杂度 \(O(n^2\sum w_i)\)

特殊性质给了我们一个提示,因为在特殊限制的情况下显然有 \(|t|\leq w_{r+1}\)。考虑怎么把这个东西推广,因为如果 DP 方程式后满足这个东西,那么时间复杂度就是 \(O(n\sum w_i)\),就是对的了。

考虑如果是选了一个东西恰好超越另一个人的完成时间,那么设这里选的是 \(w_p\),显然有 \(p\leq r+1\),而此时 \(|t|\leq w_p\),所以显然满足。

而最大头疼的地方就是你会发现如果没有超越,这个时候就有可能不满足。我们再分成两半来考虑。如果此时选了左边的,我们发现此时 \(w_{r+1}\) 不变,而 \(|t|\) 变小,归纳证明就知道其正确性。所以最大问题在于如果选右边的,这个性质就可能不满足。考虑我们正好可以把这个东西变成上一段讲的,我们记 \(L_{i,j}\) 为从 \(i\) 开始,此时剩余权值 \(j\),一直向左走,第一个走不到的位置。这样就能保证每次转移的时候要么删左边的,要么把右边的删完直到交换,可以归纳证明 \(|t|\leq w_{r+1}\)

直接贺吧,不想写了,看着容易,细节巨多。

算了,还是自己实现一下吧。

最后实现破防了。没有实现成。

最近真的是颓上瘾了,md,md,md,md,鬼知道我在干什么。

Day 13

T1 约瑟夫问题推广。场上没做出来/xk

T2 减半报警器 + 神秘线段树,4log/jy。

T3 没看。

这个集训成功把我搞爆炸了。

posted @ 2024-03-29 21:26  xingyu_xuan  阅读(32)  评论(1编辑  收藏  举报