The Final SolutionSet
「AGC003E」 Sequential operations on Sequence
萌萌题。
先用单调栈将整个序列转为单调上升的。
然后每个串可以被拆成 \(\log\) 个前面的串和一个原串的前缀。
这个的话,连上边就是一个有向无环图,我们现在相当于就是要求出拆除来的所有的前缀的出现次数。
相当于就是求 \(q\) 号点到其他点的路径方案数。dp
算就完了。
「GLR-R4」小暑
部分分提示性很强。链的部分分提示我们有一个 \(\sum a\) 的势能。
其他部分分提示我们改动一个点之后有他到根的点答案会有变化。
那么考虑全局问题,我们考虑重链剖分转化为链的问题,记录他的特征点来自于重儿子还是轻儿子。只要能够维护这个信息,我们在查询答案时就可以通过在重链线段树上二分出第一个特征点不是重儿子的位置,可以在 \(O(\log^2 n)\) 的时间内完成查询。
现在是考虑如何维护这样的信息,一次修改后,修改点上面特征点不是重儿子的最多显然只有 \(O(\log V)\) 个,我们现在的目标就是找到这 \(O(\log V)\) 个点。但是,特征点不在重儿子有两种情况,一种是重儿子前面的轻儿子的子树和大于等于轻儿子,一种是重儿子后面的轻儿子成为最后的特征点。第一种情况可以维护,第二种情况则很爆炸,因为太动态了。
考虑其动态的本质是重儿子后面的儿子太多了,如果儿子少一点就赢了,想一想让单个点儿子个数减少有什么技巧?三度化!我们将整棵树按顺序三度化一下,然后套用树链剖分,线段树维护轻儿子儿子的子树和,现在一个点有可能以轻儿子为特征点当且仅当它的轻儿子比我们当前的子树和大,这个线段树二分一下就做完了。实际上这个部分的复杂度是单次 \(O((\log V + \log n) \log n)\)。
「ARC163E」 Harmonic Mean
吐吐题。
这个首先要想到裂项法,即加入 \(\forall i \in [1 , n) \ \frac{1}{i(i+1)}\) 和 \(\frac{1}{n}\) 即可。
但是可能 \(\frac{1}{n}\) 可能会和前面的重,直接分母除以二再继续裂项。
特别地,在数据范围内 \(20\) 要去两次重,\(110\) 要去三次重。
「ARC163E」 Sum of SCC
萌萌经典题。
竞赛图强连通分量数量等于其没有入边的点集数。
用这个去 dp
就完了。即设 \(f_{i,j,w}\) 表示考虑前 \(i\) 个点,点集还剩 \(j\) 个点要去选,使用了 \(w\) 条小连大的边。
复杂度是 \(O(n^5)\)。
「JLOI2008」 CODES
注意题意是一个串可以重复选。所以直接做一个 dp
,即定义 \(f_{i,j}\) 表示结尾的是第 \(i\) 个字符串,他还剩下 \(j\) 个位置可以匹配的最小字符串是什么。这个可以直接跑一个类 dij
做就好了。复杂度是多项式复杂度,不想细算了。
「ARC163E」Chmin XOR Game
先得把题意抽象出来,给他一个简洁的形式。
什么大结论题,我破防了。
考虑 \(n = 2\) 的情况,并且值域在 \([0,4)\),如果两个数不相同且都不为 \(0\),则先手要么会把两个数变成相同的,要么会把其中一个变成 \(0\)。
不限制 \(n\),仅限制值域,那么如果他们不全为 \(0\),那么先手操作后还是会把那些非 \(0\) 的数变成 \(0\) 或者一个相同的数字。所以先手胜利条件是不全为 \(0\),且非 \(0\) 项都相同。
考虑原问题,在四进制下考虑这些数字,如果存在某一位满足上述先手必胜条件,那么先手必胜。因为我们可以让先手将这些位全部处理为 \(0\),无论后手怎么操作,一定会在剩下的位继续造出先手必胜位。
厉害的结论题!其实也不是那么不可分析,关键是要敢于从足够小的情况一步一步扩展上来。
当然,我猜最现实的切题方法是以打表为起点进行的分析,因为他的表打出来可能真的会很好看。
「20230704 模拟赛」 图
好题。核心思想是统计有效边的数量,答案就是总点数减去有效边数量。而什么样的边是有效边呢?显然如果一个点只往外连一条边,那么其就是有效的。
考虑将 \(d\) 排序,选取最小的一个 \(p\),有另一个不同的元素 \(q\)。所有从 \(x \rightarrow x + q\) 的边可以被等价地替换为 \(x+p \rightarrow x +q\)。变换后可以发现会有前 \(\min(p,n-p)\) 个点恰好只往后连一条边。
我们可以统计这些边,然后删除这些点。我们不断地做这样的操作,直到最小的数大于了 \(n\),或者最小的数变成了 \(0\),我们就删除最小的数。
这个可以用优先队列做。考虑合并这些计算,我们不断对同一种最小的数操作,一次性操作到他不是最小的数,那么对于每一对数,复杂度与辗转相除法相同。总复杂度 \(O(k \log^2 n)\)。
「20230704 模拟赛」 计算
好可惜,实现精细一点考场就可以拿 \(70pts\) 了,呜呜呜。
首先枚举乘积式里面出现奇数次的因子,显然所有项的这种因子是相同的。
显然就是用莫比乌斯函数的平方枚举,然后再算一些和式的幂次。
这里显然可以用整除分块计算,注意精细实现这里会发现实际上只有 \(O(r^{\frac{1}{3}})\) 个块。
莫比乌斯函数的平方有一个组合意义,带入进去就是需要计算自然数前缀幂的点值,大的可以拉插算,小的可以预处理算。
这样可以拿到 \(70pts\)。写满分需要将大的点值离线下来做一个多点求值。
「BalticOI 2011 Day2」Tree Mirroring
确定了两个根,那么叶子就是距离两个根距离相同的点。并且不存在一条边距离两个根距离相同。
然后就可以把树抽出来判断。
咦?其实叶子能找对的话就意味着树确实是完全相同的了。
哦,随便一个点都可以当根,我们只是要找到与它对应的那个点。由于叶子的度数一定为 \(2\),所以我们选一个度数大于 \(2\) 的当作根就可以。如果没有,则是一个大环,随便做。
然后现在枚举点当另一个根去检查,复杂度 \(O(n^2)\)。
先特判掉简单环、有度数为 \(1\) 的点的情况。
然后随便删除一个环的边,一个连通块会恰有两个在环上,这两个点一定是一对根。
「NOI2006」千年虫
好抽象的题目。
无论左右两边都是,显然是一短一长这样排列,如果长度相同可以看做一个,开头结尾都得是短的。然后去跑 dp
?是不是整个暴力 dp
,然后拍到线段树上优化?感觉很像。
试试看,看看理解错题意没有?
你说的对,但是数据结构真的好优化吗?这相当于是滚一个前后缀最小值,但甚至还要跟自己比较一轮。
很抽象。不如摸摸结论。
你这个结论太抽象了。
尝试解释一下动机,首先考虑峰谷交替,而不存在相同的情况。
如果 \(i\) 是谷,则其必然不变;如果 \(i\) 是峰,则其两边是谷,他只用比他们长一个就行了。
然后一圈讨论,他的取值大概就是他附近的值的邻域的值。感性理解吧。
「HEOI2014」林中路径
首先 \(40pts\) 非常好拿。那我加一维是不是就是一个矩阵快速幂呢?
加 \(n\) 个点,每个点朝着 \(i + n\) 连一条边,新加的点连自环,那么我们跑一遍矩阵快速幂就做完了吧。
啊呀,路径还有权值。哦,那我维护一个路径的 \(0\) 次权,\(1\) 次权,\(2\) 次权不就做完了。
抽象,大小为 \(4n\) 的矩阵过不了,怎么卡都过不了。
要把系数拆成四个矩阵然后倍增计算,无语了。
CF1637H Minimize Inversions Number
选定一个长度为 \(k\) 的子序列,将其挪到最前面,最小化逆序对大小。
如果一个位置被选择,则在他后面的比他小的数一定被选择了。
算了,不想想了,还有好多题没有做,还要准备演讲。
定义 \(d_i\) 表示只把第 \(i\) 个元素放到最前面逆序对减少的个数。
考虑选择了 \(S\) 集合的元素将其放在了最前面,则当前逆序对个数是:
其中,\(cnt\) 表示 \(S\) 集合里的逆序对。注意利用我们的结论,我们 \(S\) 集合中的元素,右边不会剩下有比他小的元素,那么 \(cnt\) 实际上是叠满了的!我们定义 \(p_i\) 表示第 \(i\) 个元素右边比他小的数的个数。
式子变成了:
那么我们只要算出 \(2 p_x - d_x\) 的值,每次选择最小的一个即可!
教训是,不要总是干想,用数学化的东西描述问题,兴许会有特别的发现。
「HEOI2015」 小L的白日梦
有一些很简单的想法,由于每一次活动是相当独立的,我们的目标是保持状态的不变性。就是说如果她处于不高兴的状态,我们希望选择大概率让她继续不高兴的活动。如果高兴,我们就选择大概率让她继续高兴的活动。感觉就很对。
但是怎么算呢?好抽象,呜呜呜。
我日?你这个,好抽象。题意居然是在开始之前就决定活动安排!
抽象住我了,题意相当于决定一个序列,最小化 \(\sum\limits_{i=2}^k (1-a_{i-1})a_i\)。
尝试交换两个元素分析,虽然很不严谨,但是从感觉上就是单调不增的最优。算了,没时间了,看题解。
哦,正确的降序证明是,因为此时 \(\sum a_i\) 是定值,转化为最大化 \(a_1 + \sum\limits_{i=2}^k a_{i-1}a_i\)。
显然降序最大。
题解还说,选出 \(k\) 个数是所有数降序排列后的一段前缀和后缀。
开头和结尾一定会选择,这个简单讨论就好了。
所以一定会选到一段前缀和一段后缀。
后面好像考虑到一点,就是说考虑当前两个端点,如果概率和大于 \(1\),我们就在前缀再选一个,否则就在后缀再选一个。做完了诶。
「20230706 模拟赛」掌分治
有一道统计树分治方案数的题,但其实期望这个问题会比我们的方案数要弱一些。
因为期望具有线性性,我们可以分开计算。
如果是树,统计两个节点之间的贡献即可。
如果是仙人掌,则要考虑环的问题!环怎么办捏,如果只有一个环,我们显然就直接容斥掉了。
如果路径途径了很多环,我们也考虑容斥。算一下容斥系数,省略一通操作,我们发现容斥系数就是 \(-1\) 的环的个数次方。
做完了。
「20230706 模拟赛」图圈圈
毕竟我只需要找到是否存在两个长度相同的环而不需要找到环具体的样子,我在考场上将问题分析强了。
只要每次能找到一个新的简单环,那么找到 \(O(n)\) 个简单环就可以结束。
对于一棵 \(dfs\) 树,非树边个数 \(\geq n\) 时就一定有解。
那么现在边数和点数是一个级别了。
每走一步判断能否回到根,此时复杂度 \(O(n^3)\)。
题解觉得,非树边个数 \(\leq n\) 的限制还是很松。太抽象了吧你也。
题解说,实际上 \(2 \sqrt{n}\) 条非树边就足够保证有解。
考虑一个满秩的不合法情况,就是 \(3 \sim n\) 的环各出现一次。
我们随机删除 \(\sqrt n\) 条边,剩余环的个数期望不超过 \(\sqrt n\) 个,一定是存在方法优于期望。
那么我们再删不超过 \(\sqrt n\) 条边就可以让其没有环。
所以如果一个不合法情况,最多只能有 \(2\sqrt n\) 条非树边。
然后我们建虚树,就将点边数量都缩小到了 \(O(\sqrt n)\) 级别,再做上面的做法,复杂度就是 \(O(n^2)\) 的。
「ZJOI2018」 迷宫
抽象啊,啊,抽象。
好难啊。如果是 \(k = m\),则 \(n = 2\) 即可。所有点的非 \(0\) 边连向 \(1\),否则连向 \(2\)。
从细微处分析!如果 \(k < m\),则 \(1\) 的第 \(k\) 条边一定是自环。
首先,\(n\) 的上界是 \(k\),就是说每一个点对应一个 \(\bmod k\) 的余数,边就很好连了。
其次,如果我们想要 \(n\) 更小,就是说,我们可以让一个点对应更多的 \(\bmod k\) 的余数。
你比如说,\(m=2,k=4\) 的情况,实际上只用 \(n=3\),即可。首先,第一个点能且只能对应 \(\bmod k \equiv 0\) 的路径。令 \(2\) 号点先对应 \(\bmod k \equiv 1\),此时发现 \(2\) 号点不能对应余数 \(2\),否则矛盾。所以令 \(3\) 号点对应余数 \(2\)。现在考虑 \(2\) 点的 \(1\) 边和 \(3\) 点的 \(1\) 边。
\(3\) 点的 \(1\) 边直接对应余数 \(1\),\(2\) 点的 \(1\) 边均对应 \(3\),就是说一个节点的元素同一条边需要对应的节点相同。
来!手玩一下 \(m=6,k=8\) 的情况!
1(0) : 0 1 2
2(6) : 1 5 3
3(4) : 6 2 4
4(0) : 4 1 2
5(2) : 3 7
哦?那就是这样?不是,这只是一个上限罢了。
答案的上限是 \(\min(k , \frac{k}{\gcd(m,k)}+1)\)。
但是不够!因为有点可以合并!\(m=2,k=8\) 的时候代表 \(\times m = 2\) 和 \(= 6\) 的点可以合并!
其中他们的 \(0\) 边均指向 \(= 4\) 的点。
看了一眼题解,他说不能仅仅只考虑 \(\times m \bmod k\) 相同,考虑完了就是一个子问题?
不懂,换一篇。
如果没有这个起终点,所有点都可以压在一起呢!是 \(0\) 赋予了整个问题特殊性!
两个节点等价当且仅当它们走到 \(0\) 的路径集合相同!好有道理,这么清晰好多。
那么我们不妨每次枚举左移多少位,将左移一定位数后相同的合并起来。然后丢掉那些有办法在当前位数回到起点的数字即可!
「20230707 模拟赛」跳跃
首先有,考虑倒着确定每个位置是否被选择,这样不用考虑起点在哪儿。
其次有,两条跳跃方案,因为要距离和次数均相同,因此要满足 \(A\) 和 \(B\) 均相同。因为 \(A <B\),所以其实只用保证距离和 \(A\) 的次数相同。
我们考虑 dp
,记录两个方案的 \(A\) 次数差和两个位置。
状态数过大,考虑优化状态。发现两个位置之间的距离 \(< B\) 或者相等。然后我们就通过不等式夹一下靠前的位置的值,我们发现我们只用知道 \(A\) 的次数差和靠后的位置,\(B\) 的次数差就可以唯一确定。
那么状态数就变成了 \(\frac{n^2}{A}\) 了。
「20230707 模拟赛」图论题
注意到对 \(2^m - 1\) 取模,这个东西的性质其实特别好。相当于原数加上原数右移 \(m\) 位后对其取模的结果。
对于一个点,他走完 \(m\) 步之后,到其他点的方案数恰好为 \(1\),到自己的方案数恰好为 \(2\)。
那么就能想到,将 \(n\) 分成若干段,每一段的长度为 \(m\)。走 \(k\) 步能到达哪些点也是好确定,就是把最高的 \(k\) 位挪下来,然后加上 \([0,2^k)\) 的数所能得到的点。那么就可以算出一些初始状态。
然后就是矩阵乘法的部分,我每次计算在第 \(\bmod m \equiv x\) 步的贡献和。定义矩阵,维护到非终点无色点的方案数,非终点蓝色点方案数,到终点方案数,到非终点答案,到终点答案。矩阵大小为 \(5\)。
然后枚举初始状态,然后算一下就做完了吧。破防了。
「20230707 模拟赛」配对
考场上只会了 \(O(n^2)\) 的做法。
在选择了 \(i,j\) 后答案是唯一确定的,并且一条边在某条链上当且仅当它连接了两个奇数个叶子的树,我们称为实边,否则称为虚边。注意到实边上一定会有两个元素异或起来。
题解说,考察换根 dp
,求出一个无根树子树 \(u\),将它内部删除一个叶子 \(v\) 后权值最大是多少,哈哈,我考察过但失败力!
如果有偶数个叶子,那我们还要记录传上来的叶子是什么,所以爆炸力!题解鼓励我摆烂,只记录有奇数个叶子的子树的 dp
值。
考虑转移,假设它到父亲和左儿子都是实边,到右儿子是虚边。但我们根本不知道虚边上的信息,我们需要沿着虚边 dfs
,直到找到所有到父亲是虚边,到两个孩子是实边的点。又被抽象到了。
哦,沿虚边往下的话要么找到两个实边儿子的,要么找到两个虚边的。注意到,每个实边我们只会从上面访问一次,所以复杂度是没有问题的。然后具体转移?
哦?类似我的 \(O(n^2)\) 做法,本质是依次考察,对于这些点依次考察是否删除了子树里的一个点,删除了就考察后面,以这种方式决策出最大值。
看不懂,妈妈生的,破防了。
「JOISC 2023 Day1」 Two Currencies
萌萌数据结构,树剖主席树啥的随便做一下应该就好了。
「JOISC 2023 Day2」 Council
注意副主席是在表决前决定的。
人口很多,但提案数很少。看这个数据范围,我就觉得是 \(2^m\) 的捏。
有些议题可能是必然能通过的,因为他们的赞成票的个数超过了 \(\lfloor \frac{N}{2} \rfloor + 2\)。
主要讨论赞成票个数为 \(\lfloor \frac{N}{2} \rfloor + 1\) 和 \(\lfloor \frac{N}{2} \rfloor\) 的。
哦,可以先枚举了主席,然后再看哪些赞成票个数为 \(\lfloor \frac{N}{2} \rfloor\),维护出集合 \(S\)。然后每个人维护一个投票情况 \(s_i\)。
然后,现在变成了最小化 \(|S \and s_i|\)。对 \(s_i\) 取反,得到 \(t_i\),将问题转化为 \(|S \and t_i|\) 的最大值。然后用高维算一下就好了。
「20230708 模拟赛」 地图编辑
进入惯性思维的陷阱了,呜呜呜。
这个其实没有那么麻烦,容易发现的是,我们删除一些边界角角上的障碍物,那么最短路要么不变,要么减小 \(2\)。我们给每个障碍物钦定一个删除顺序,然后二分检查最短路即可。
「20230708 模拟赛」 摸底测试
首先求一个字符串 \(s\) 的 \(g\) 值是容易在 \(O(|s|)\) 的复杂度范围内解决的。只需要建一下后缀自动机,然后计算每个点的 endpos
的最小值和最大值,然后差分一下就好了。
下面其实就只用到了一个小 trick
,我们肯定要二分答案,然后计算最小划分数。而划分段直接做会是 \(nk\log n\) 的,难以接受。但我们可以先倍增再二分,那么我们找到 \([l,r]\) 这个字符串的复杂度就是 \(O((r - l + 1)\log n)\) 的,均摊下来就是 \(O(n \log n)\) 的,所以总复杂度就是 \(O(n \log n \log V)\) 的。
「20230710 模拟赛」 树上游戏
被打烂了,\(S(P)\) 的点对贡献显然可以容斥成所有点对减去 \(i\) 是 \(j\) 的祖先时 \(w_i \leq w_j\) 的点对 \((i , j)\)。
考虑一个点从属于 \(G\) 到属于 \(P\) 的变化,由于 \(G \cup P\) 是全集,所以在 \(w\) 互不相同时,加入一个点的点对贡献变化是只与子树大小和祖先个数有关的常数,直接做就好了。
现在要考虑 \(w\) 有相同的情况。
「20230710 模拟赛」 算法考试
首先是枚举中位数,然后可以直接 dp
计算,然后乘上一些系数,期望得分 \(35pts\)。
实际上,这里是个经典 trick,我们可以离散化,每一段内部的 dp
值相同,系数与枚举的中位数有关,那么显然系数是一个多项式,可以拉插算,期望得分 \(50pts\)。
观察可以得到,只有很少的区间的 dp
值不为 \(0\),因为我们的 \(k\) 个空位置只能让我们的中位数偏移 \(O(k)\)。
然后即可通过此题。
「20230710 模拟赛」 土地划分
非常厉害的转化。
如果两个矩形之间有交,那么将他们连边。
问题转化为三元生成子图没有边。
但仍然不好算,考虑容斥,设 \(S_i\) 表示有 \(i\) 条边的三元组,那么 \(S_0 = \binom{N}{3}-S_1-S_2-S_3\)。
这几项仍然不好求,我们可以改求钦定 \((x,y)\) ,\((x,z)\) 无边的三元组数量 \(A\),则有 \(A = 3S_0 + S_1\)。
求出 \((x,y)\),\((x,z)\) 有边的三元组数量 \(B\),则有 \(B = 3S_3 + S_2\)。
显然 \(A,B\) 的求解等价于求解每个点的度数,此外我们还需要求解 \(S_3\) 的值即可解出 \(S_0\) 的值来。
问题被这样拆解为了两个部分,我们分别来看两个部分如何做。
求度数即求每个矩形与多少个矩形有交。
拆成两部分,一部分是 \(l_j \leq l_i\) 的情况,一部分是 \(l_j > l_i\) 的情况。
只需要维护一个支持增加区间,删除区间,查询区间与多少区间交的数据结构即可。
这个容斥成求不交区间即可。
现在就是求三元环的数量。
显然三个矩形交出来还是一个矩形,我们考虑在这个矩形的左下角统计贡献。于是需要容斥掉其他位置产生的贡献。这个容斥就是类似于二维前缀和的容斥。
于是直接用扫描线维护结果。
「20230711 模拟赛」 沙鸭 / CF1693E Outermost Maximums
奶奶滴,这个 \(n^2\) 写的太愚蠢啦!
每次把最大值操作成他能够达到的最小值,因为单调性,所以这个界是一定能够被达到的!
直接 \(O(n^2)\) 模拟就好啦!不用写什么大 dp
。
有一个显然但重要的性质,就是说如果是一个数被操作过,那么其不会再成为前后缀严格最大值。
然后每个数操作时能够变成的最小值就可以在初始的数组里面去算。
每个数的操作就独立开了?这么牛。
然后是做维护一个什么序列 \(b\),\(j\) 在第 \(i\) 位左右两边出现的情况。
然后用矩阵乘法即可维护。
「20230711 模拟赛」 字符串 / 「CTSC2016」 萨菲克斯·阿瑞
显然这个排列会形成由小于号或小于等于形成的不等式链。
对于一个后缀数组 \(sa\),我们定义它的秩为最小的 \(m\),满足存在字符集大小为 \(m\) 的字符串,其后缀数组恰好为 \(sa\)。也即是不等式链中 \(<\) 的个数。
考察 \(m = 2\) 的情况,不妨先来统计秩为 \(2\) 的 \(sa\) 的个数。
设有 \(A\) 个 a
,\(B\) 个 b
。易知,其实就有 \(\binom{A+B}{A} - 1\)。
讨论 \(m=3\) 的情况,这个继续考虑容斥,则秩为 \(3\) 的 \(sa\) 的个数就是:
\(tot = \binom{A+B+C}{A,B,C} - \binom{A+B+C}{A+B,C} - \binom{A+B+C}{A,B+C} + \binom{A+B+C}{A+B+C}\)。
但题目不是让我们统计秩为 \(m\) 的 \(sa\) 的个数。
我们刚刚所做的事情,实际上是在构建一个一一对应,让一个秩为 \(r\) 的排列恰好在字符集大小为 \(r\) 时被统计到一次。
但是这面临着一些关键的问题,就是说一个秩较小的后缀数组由一个字符集较大的字符串得到,但是这个秩较小的后缀数组对应的字符集大小相同的字符串不满足要求怎么办?
这个就是考虑填充的过程,如果我们的一个字符 \(c\) 的填充次数达到上限,那么我们将 \(c+1\) 的次数全部借给 \(c\)。
注意到, 这个相当于做了一个字符的替换。
那么剩下的工作就只有做一个仿照前面的式子做一个容斥 dp
即可。
「SCOI2016」 围棋
考虑状压每个位置开始是否可以有第一行或者第二行的组合开始的状态的方案数。
这个可以 \(3^mq\) 预处理出来。
嗯!我感觉他状态数并不多,可以直接枚举两行的状态,然后转移。
试试看才知道!
哈哈哈,果然很小,简直就是小丑题。
正解大概是轮廓线 dp
,我们不需要记录第二行的匹配情况,只需要记录新行跟第一行的匹配情况,同时处理当前在第二行的匹配情况即可。
「ZJOI2019」 Minimax搜索
考察 \(L=R=n\) 的情况,即计算无论如何都不会引起根节点权值改变的方案数,这个的话发现可以定义 \(f_u,g_u\) 分别表示以 \(u\) 为根的子树内可以使得其值大于 \(v\) 或小于等于 \(v\) 的方案数。
那么根据这个方法,我们每次可以 \(O(n )\) 求出消耗能量不超过 \(x\) 的方案数,这里已经给到了 \(70pts\),料想剩下的不多了。
发现随着 \(x\) 每次增加 \(1\),只会有 \(O(1)\) 个叶子的 dp
值发生改变。
于是考察动态 dp
。在此之前,我们需要整理一下 dp
的一些细节。
ARC164E Segment-Tree Optimization
每个询问区间对答案的贡献为 \(1\) 或 \(2\) 或 \(4\)。其来源于左端点区间的深度,右端点区间的深度。
考察区间 dp
,并引用费用提前计算的思想?
先就可以算出一个区间是否覆盖了别的区间。然后我至少会一个 \(O(n^3)\) 的区间 dp
?
无语住了,题解说,建立一个 \(n\) 个点的链,对于一个区间给第 \(l-1\) 条边和第 \(r\) 边打上标记。然后对这些标记建立线段树。
这个答案就是 \(d = \lfloor \log_2 cnt \rfloor+1\)。 流汗了,被薄纱了。
然后就是一个倒着建立线段树的一个过程,对着这个过程进行 dp
计算就可以力!
不明白,下面是一些自己感受到的理解,就是本质上我是将整个区间通过离散化缩成了若干个点,然后得到了二叉树得到这些点的最小深度。
现在我们要考虑在最深处的贡献,也只用对最深处的贡献进行统计。那么就是对这一大串的缩起来的点选择一些相邻的两个点进行合并。这个贡献比较奇怪,合并起来就是起点在左儿子的区间个数加上终点在右儿子的区间个数再减去区间恰好是合并起来的区间的区间个数乘以二。
大概是这样?是的,但是有特判,比如缩完点后只剩下了一个点。
「20230713 模拟赛」简单计数
抽象死我了,我考场一直在对边计算概率,但其实对边计算概率不是一件容易的事。
对点计算左右两部分就是独立的可以直接算,抽象死我了。
「20230713 模拟赛」队伍分配
其实也不难,对每个点限制流量最大为 \(2\)。利用费用流,一个置为足够小的权 \(M\),一个置为 \(1\),我们限制不能有边权为 \(1\) 的与边权为 \(1\) 的增广。那么就可以注意到肯定会优先增广 \(2M\) 的路径,所以增广出来的效果就是只有长度为 \(2\) 的链和长度为 \(3\) 的链。
直接跑费用流会 \(T\),但最短路一共只有两种,一个是 \(2M\),一个是 \(M+1\)。我们先按最短路找一个分层图,并对这个分层图跑最大流复杂度即被限制到了做二分图的最大流时的 \(m \sqrt n\)。
「THUPC 2023 决赛」 阴阳阵
又是计数捏。
黑点必须连向白点,所以一个环上白点的数量不少于黑点。提出一种假设,如果环上不满足条件有可能可以通过某种方式容斥掉。
一个环里只能有偶数条白点到白点的边。
考虑容斥?我们枚举奇环,然后剩余的边随便连,容斥系数就是奇环的数目。
哦,那实际上容斥系数就是白白边的数量。
我枚举一些点,要求这些点能够成为若干个环,令一个黑后面连接若干个白点为一个单位。每个单位显然可以原地成环。
那么我们定义 \(f_{i,j}\) 表示考虑了 \(i\) 个白点,组成了 \(j\) 个单位的方案数。
其余白点的方案最后补上,其余黑点的方案在开头计算。
做完了吧应该。不对,好像有些问题?因为我们有可能枚举出偶环,所以会导致一个状态被反复计算?
哦,会导致最后算出来的答案乘上一个 \(2^c\) 次方的系数,其中 \(c\) 表示基环树中偶环的个数。
如果有奇环显然被容斥掉了,不影响。如果没有则要特别考虑。
啊,读错题了。
类似强连通分量耳分解,每次钦定从编号最小,并且没有出边的点开始(有白点则为最小的白点,否则为最小的黑点),一路确定出边,并最终到达一个定过出边的点或形成一个新的连通块。
具体地,采用分段 dp
,定义 \(f_{i,j}\) 表示用了 \(i\) 个黑点,\(j\) 个白点的方案数。
定义 \(g_{i,j,0/1,0/1}\) 表示用了 \(i\) 个黑点,\(j\) 个白点,生成的链结束点是 黑/白 当前点的颜色是 白/黑 的方案数。
定义 \(h_{i,j,0/1}\) 表示正在添加 \(P\) 型的杆,生成的杆当前点的颜色是 白/黑 的方案数。
定义 \(l_{i,j,0/1,0/1,0/1,0/1}\) 表示在添加 \(P\) 型的环,起始点的颜色,当前点颜色,环上白点个数奇偶性,黑点个数奇偶性。
「20230713 模拟赛」队伍分配
先建虚图,然后没有额外边的点的贡献实际上就是 \(1\)。
然后对这些有额外边的点实现一个最小生成树。
但是边的级别是 \(n^2\) 的。
但是这题的名字叫 boruvka
,所以我们考虑使用 boruvka
。
大概就是每次将当前连通块扩展一条最小的边。那就做完了其实。
想想看我把这个算法记错没有,咱来证一证。
哦,显然正确。考虑一棵最小生成树,如果我们一个连通块存在一条未选择的边很小则可以考虑破圈。
考虑到 set
太慢了,我宁可用链表。
错误的,感觉只能写线段树维护到达某个点的边权最小值。
「20230713 模拟赛」路径压缩
不妨来罗列一些基本事实。
如果有 \(g_x = x\),则一定有 \(f_x = x\);
先对 \(g\) 数组建出一个森林。
题目要求的是实实在在的构造,而不是要求了一个常数的操作次数上限。
\(f_i = i\) 当然是随便做。递归生成树即可。
然后 \(n \leq 6\) 肯定也随便搜。50
分已经有了。
12 点如果想不出来就去写。
接下来就是说,我把 \(g\) 的树建出来,然后每个数有一个深度属性。
然后 \(f\) 这边有一个初始树。存在一个点,他目标父亲的深度大于当前根,则完全不可能完成构造。
如果目标父亲深度小于等于当前根,那么我们不妨提早将其并上去。完成对所有的这样的点的操作。
现在考虑 unite
,根据直觉,我们找一个根深度最大的连通块。
然后找到连通块里的需求的深度最大的且小于当前根的需求,那个需求点必然是某个连通块的根,否则无法构造。
然后把根和根 unite
起来。不断重复这样的操作是否就解决了呢?感觉是的。
不是的,萎飞了,呕吐吐。
最终成环或者初始状态联通的点最终不联通则无解。
然后考虑一个树的情况。因为 find
操作只会破坏祖先关系而不会新增祖先关系,所以如果 \(x\) 是 \(y\) 的父亲,那一定是某一步 \(y\) 直接合并到 \(x\)。所以在最终时刻有 \(x\) 是 \(y\) 的祖先的限制,那么任意时刻都需要满足。
如果最终某个 \(r_x\) 的子树存在点 \(u\),使得 \(u\) 在初始时位于另一棵子树 \(r_y\) 内,那么一定存在一个时刻使得 \(r_x\) 是 \(r_y\) 的祖先。如果限制成环,那么显然无解,因为祖先关系的添加只能通过连通块的合并来实现。
所以跑出一组拓扑序来先。
然后注意到,如果 \(x\) 是根,\(y\) 是 \(x\) 的儿子,\(z\) 是 \(y\) 的儿子,那可以将 \(z\) 提成 \(x\) 的儿子,而其他结构不变。
然后剩下的和我考场思路一致,就是说如果当前父亲不是最终父亲,那么我们就给他 find
一次,在初始时这么做一定是不劣的。
Barbecue
有一种感觉,跟回文其实关系不是特别大。
考虑一种必败态,就是不管选左边还是选右边都会跪的情况,显然就是所有元素都相同。
我们需要考察连续的相同元素段。假设只有两种元素构成 \(aaaa\dots bbbb\) 的形式。那么最终只会剩下两个元素。
考察此时元素的奇偶性即可。
Dynamic Reachability
\(12s\),\(n \leq 5 \times 10^4\)。
感觉就是只要我有个什么能跑的暴力算法就能过。
直接暴力做想必是 \(mq\) 的。离过想必多了 \(8\) 的常数。
先考虑没有修改的情况吧。
好像可以阈值分治,设阈值 \(B\),如果相邻两个修改之间有大于等于 \(B\) 个询问,则 bitset
预处理然后查询。
哦,就是操作分块。定出非关键边,然后对非关建边 dp
,算出可达性。然后再用关键边以及可达性信息回答询问。
P9462 众数 II
凡是包含了超过一个段的,最小众数都是 \(1\),先统计这些区间。
其次就是那些只在一个段里的。在一个段里的就是说,最小众数就是左端点的权值。
哦,萎了,憨笑。
大体思路还是分开算。先算在同一个块里的,再算不在同一个块里的区间。
同一个块里的好算。不同块里的可以计算权值大于 \(1\) 的个数和权值,然后再容斥出权值为 \(1\) 的个数就做完了。
UNR #7 Day 1 那些你不要的
每次操作不会影响元素位置的奇偶性。
因此最后剩下的一定是奇数位次的元素。那么一个删最大的,一个删最小的,最后得到的就是奇数位置的中位数。
P9462 终点
首先考察 \(fa_i < i\) 的部分分。
\(1\) 和 \(2\) 之间有边。定义他们为根。
然后我们依次考虑每一个点 \(x\)。看其与 \(1\) 和 \(2\) 哪个距离为偶数。
然后得到中点,再看中点与中点的父亲哪个与其距离为偶数。然后迭代下去。只需要 \(\log\) 次就能迭代出父亲。
而对于整体情况,我们取一个距离 lowbit
最大的,就可以得到选定根的一个相邻点。
然后开始 bfs
。一层一层地确定父亲。按深度一层一层拉出来就好了。
UNR #7 Day 1 火星式选拔
我是蛤 G。
结论明明都想完了,最后一步没有想到,麻了。
由归纳法可以得到,\((l,r,k)\) 的答案集合是 \((l,r,k+1)\) 的子集。
那么接下来就是不断地做 \(k=1\) 的时候我们做的事情。
那么本质上是什么呢?其实就是不断地选 \(b\) 最大的且不能被后面的选手破防的选手。
我们期望找到每个元素刚好贡献时 \(k\) 的取值。
在单组询问中,我们从大到小枚举 \(a\) 和 \(b\),然后打标记。当选中了一个没有标记的 \(b\),那么去除它的标记,并找到那些 \(b\) 比他大的且去除标记后就可以贡献的位置。并以 \(b\) 为关键字丢进堆里。每次一直做,直到堆空了即将 \(a\) 的权值减少直到算完为止。
实际上,不断区间怎么扩展,一个区间里的元素的相对选取顺序是不会变的,因此我们只用对区间 \((1,n)\) 做一遍上述流程即可。最后再用主席树维护既可以快速回答询问。
?
我又被骗了?
\(b_i\) 前 \(k-1\) 大的人,他们永远不会成为 \(b_i\) 最小的人,因此不会被踢出,但会因为 \(a_i \geq b_i\) 而进入。
那么就可以转化为一个类似 \(k=1\) 的问题。只有前 \(k\) 大的 \(b\) 都出现过之后,第 \(k\) 大的 \(b\) 才会成为最小值进而被替换,从最后出现的位置开始倍增就好了。
「国家集训队」JZPKIL
注意到 \(\gcd(i,n)\operatorname{lcm}(i,n) = in\)。所以先讨论 \(x\) 与 \(y\) 的相对关系。
设 \(p = x - y\)。
有式子:
目测自然数幂和,拉插估计跑不脱了。
然后肯定要枚举因子,大概率要 Pollard_Rho
了。
来嘛!枚举因子,但是欧拉函数描述的里面感觉会爆炸,还是用莫比乌斯函数描述吧!
其中 \(S(n,y)\) 表示前 \(n\) 个自然数的前 \(y\) 次幂和。
继续!
那能不能说,我把拉插的各项系数拆开,然后分开递推。
好像能递推?考虑去除一个质因子。
讨论这种质因子有几个,如果有大于一个,那么只用乘以这个质因子的幂次即可!
否则,乘以这个质因子的幂次减这个质因子的 \(y\) 次方!
好递推。那么答案的式子现在可以写成:
两个东西都是可以递推的,但是后面那个需要对每一个幂次分别计算,复杂度是不是有些高了呢?
确实偏高了,他留了 \(30pts\) 给我。结合 \(x=y\) 我可以拿到 \(60pts\) 的好成绩。
哦?\(H\) 还是一个积性函数。可以拆成质数幂次。
嗯,要不然还是把拉插插出来的系数写出来:
害!果然,还是对积性函数性质和狄利克雷卷积不熟悉了。
那么后面那一坨就是关于 \(n\) 的积性函数,剩下不是随便做?
【PR #10】训练
怎么办?又要不会做签到题了。
最优解显然不会有元素减到 \(0\) 的情况,否则可以从开始就不选。
考虑记录在连续的一种学科与另一种连续的学科变换处记录状态,再记录剩下的学科上次学是什么时候。
然后给转移按照剩下的学科分类,会发现转移式是一次函数,可以用斜率优化。但我选择李超树。
【PR #11】作业
每个字符串最小表示下标出现的概率与周期相关。
在 sub 2
中,保证 \(a_i\) 全部为质数,就是说除了第一个位置外每个位置成为最小表示的概率相同。
因为第一个位置在所有元素全部相同时概率会大上一些。
然后我们可以计算一个 \(f_x\) 表示周期长度为 \(x\) 时的方案数。这个容易通过一轮容斥计算。
根据期望的线性性,我们可以算相邻两个元素对答案的贡献。
然后类似整除分块,我们按照因数分块计算,就做完了。
因为 \(10^5\) 以内的数,最多只有 \(128\) 个因子。
CF802O April Fools' Problem (hard)
Medium version
显然就是一个费用流的经典模型。
左入右出,考察模拟费用流。
我是哈卵,这个线段树居然可以直接维护起来。但怎么维护啊,没弄明白。
流汗,是 shaya 春测模拟赛的 T2
,我现在看见怎么还是不会。呜呜呜。
好的!反悔贪心弄明白了!
看线段树模拟费用流的做法。!好技巧!
对于区间内,我们不需要维护最小值等于 \(0\),我们直接把最小值看做 \(0\) 即可!这样我们的区间修改就可以实现了!
明白了!但加训反悔贪心!
CF730I Olympiad in Programming and Sports
显然有一个带权二分图匹配的模型。
虽然暴力能过,但我们还是考虑一下反悔贪心。
注意到其实是 Coins
的弱化版。
CF1697F Too Many Constraints
其实和 2018 那个集训队互测差不多。\(k\) 个值拉出来建点,建两个对立点,一个是大于,一个是小于等于。
然后跑 2-sat
就做完了。
P4548 [CTSC2006] 歌唱王国
是硬币游戏弱化版。用 \(i\) 步没结束的生成函数写答案生成函数的递推式,带入 \(x=1\),答案生成函数是概率,所以收敛,所以一定是 \(1\)。
然后就 KMP
算一下就好了。
P5607 [Ynoi2013] 无力回天 NOI2017
之前在模拟赛碰到的 trick
,在这里见到了。
做一个差分异或,区间修改变成单点,现在用线段树维护线性基就好了。
P4292 [WC2010] 重建计划
不要 \(\log^3 n\),我们二分,然后长链剖分做 dp
。
存在 dfn
序的位置,我不知道怎么线性,所以在这里又带了个单点修 RMQ
的 \(\log\)。
P3317 [SDOI2014] 重建
矩阵树定理板题,但是要注意合并概率为 \(1\) 的点。
P1527 [国家集训队] 矩阵乘法
整体二分复习题。
P5439 【XR-2】永恒
虚树常数检测题。
先点分治,算一个点对贡献多少个路径。
这个先建棵大虚树,不管它是不是在一个子树一并算了。再对每个子树建虚树容斥掉。
我发现了虚树常数确实很大。