2025 广二集训

Day1

Day2

bai

给你一个长度为 \(n\) 的序列 \(a\)\(m\) 次询问,每次询问给定三个整数 \(l,r,k\),你需要求出下面问题的答案

  • 有一个初始为空的栈,把序列中下标在 \(l\)\(r\) 之间的元素依次加入栈中,每加入一个元素之前把栈顶前 \(k\) 个元素中与即将加入的元素相同的元素删除,最后栈中有多少个元素?

我们可以发现每一对相同元素是否能消去,对于\(k\) 是单调的,且最小的可以消去的 \(k\) 即为两元素之间不同元素的种类数,那每一对可能消去的元素可以看为一个三元组 \((L_i,R_i,K_i)\),那对于每一组询问即为求 \(l\le L_i,r\ge R_i,k\ge K_i\) 的三元组个数,三维数点即可。

fa

题面较长,不想放了。

一种直接的做法是把所有方程列出来后直接高斯消元,\(O(n^3)\)得分10pts,我们考虑优化消元过程,每个叶子节点,一定只由它的父亲表示,那我们就可以从叶子节点向上推,逐层让父亲消去方程中儿子的系数,只由自己的父亲节点线性表示,这一过程可以由线段树合并实现,但这样回代还是 \(O(n^2)\) 的,我们考虑用可持久化线段树合并,同时把修改标记放在边上,然后在回代过程中记忆化带入即可,\(O(n \log^2n)\)

zhong

给你一个大小为 n 的字符串序列 a ,定义 \(f(s,t)\) 为字符串 \(s\)\(t\) 中的出现次数,$$g(l,r)=\sum_{i=l}^{r} \sum_{j=i+1}^{r} \max(f(a_i,a_j),f(a_j,a_i))$$
给你 \(m\) 次询问,每次询问给定 \(l,r\) ,询问 \(g(l,r)\)
\(n\le 4*10^5\)

原问题显然等价于求 $$g(l,r)=\sum_{i=l}^{r} \sum_{j=l}^{r} f(a_j,a_i)-\sum_{i=l}^{r} \sum_{j=l}^{r} [a_i==a_j]$$
对于后边一项我们可以用莫队加哈希直接维护,主要考虑前半部分,我们还是考虑莫队,把所有的串的AC自动机建出来后,在移动左右端点时,会产生的变化相当于fial树上的一个子树和这个点到根的路径上的的节点,我们维护两颗树状数组,一个维护子树贡献,单点加区间查询,一个维护节点到根路径上的贡献,区间加单点查。但这样时间复杂度是\(O(n\sqrt n \log n)\),不足以通过本题。题解说可以换成二离莫队,做到\(O(n\sqrt n)\)。还有老哥讲了一个小常熟带\(\log\) 的SA做法,也能过

好题分享1

好像只听懂了一道

[ARC160F] Count Sorted Arrays

给定一个 \(n\),初始有 \(n!\) 个长度为 \(n\) 的排列​。给出 \(m\) 次询问,每次两个数 \(a\)\(b\)\((1≤a<b≤n)\),对于任意一个排列 \(S\),如果 \(S_a>S_b\)​,那么交换 \(S_a\)​ 和 \(S_b\)​,操作结束后输出此时已经排好序的序列个数。
本题强制在线 \(n\leq 15, m\leq 5*10^5\)

我们考虑本质上这就是一个排序的过程,\(n!\)太大显然不能直接枚举,我们换一种方式来刻画一个排列,对于\(0-n\)的每一个\(k\) ,按如下方式生成的序列 \(P\)\(P_i=[S_i\le k]\) ,考虑从 \(k\)\(k+1\) 时,新增了一个 \(1\) 的位置 , 我们对每一个二进制数向比它们多一位 \(1\) 的二进制数连边,那每一个排列就与一条从 \(0\)\((1<<n)-1\) 的路径一一对应,一个排列好序,当且仅当它路径上的每一个二进制数都排好序,这样我们就可以直接拓扑一遍,只走那些排好序的点。

对于一次操作就可以让第 \(x\) 位为 \(1\) 和第 \(y\) 位为 \(0\) 的二进制数交换这两位,如果对 \(m\) 次操作暴力修改,时间为 \(O(mn2^n)\) ,但我们可以发现对于一个\(01\)序列,最多\(n^2\)次操作一定能变为有序的,所以有效操作不会超过 \(n^2\) 次,在每次修改时判断此次操作是否有效,就可以做到 \(O(n^32^n)\)

Day3

pompom demo

一个长度为 \(n\) 的颜色序列,把它们依次加入一个栈,对于每种颜色有一个属性 \(a_i,b_i\) 如果加入一个颜色为 \(i\) 的球后,此时栈顶的 \(a_i\) 个球颜色均为 \(i\) 则这个球会转化为一个颜色为 \(b_i\) 的球。求出有多少种不同的颜色序列,最终栈中只剩一个元素。

感觉最近都不会做DP了,直接正向考虑不太好刻画,我们不妨从终态往前推,考虑最后一个元素是怎样产生的,

sheep

简化一下,给定一棵 \(n\) 个点的树,点有点权,每个点有一个标记代表它是否可选。
\(m\) 次修改,操作共 3 种:
1.改变一个点是否可选
2.单点修改点权
3.查询所有可选点中,最大儿子子树和最小的点(树的重心)的最大的儿子子树和

我们先来考虑如果所有点均可选如何维护,上数问题就变为了动态维护树的重心,我们从重心的性质入手:

  • 重心的子树和 \(> \frac{sum}{2}\)
  • 重心任意一个儿子的子树和 \(\leq \frac{sum}{2}\)

通过上面两条性质,我们可以得出结论:

  • 把树用 \(dfn\) 序拍成序列,序列上第一个前缀和大于 \(\frac{sum}{2}\) 的位置一定在树上重心的子树中
  • 重心一定是我们找到的上述点的父亲中第一个子树和大于 \(\frac{sum}{2}\) 的点。

那这就变为了一个容易维护的信息,我们按 \(dfn\) 序建线段树,修改操作线段树上单点改,找重心的过程就可以用线段树上二分和倍增实现。还有一个问题就是如何在修改后找一个点的最大儿子子树和,我们考虑树剖维护,对于一个点重儿子的信息每次暴力查询一遍,轻儿子的信息在放到一个 \(set\) 中维护,修改时直接修改会作为轻儿子被计算的路径上的点即可。

现在再来考虑我们树上的重心是否可选,如果可选那即为答案,不可选就没有作用了吗,其实不然,我们考虑重心到根的路径外的点中,它们的最大子树一定是 \(sum-size_i\) ,那我们直接查询这些区间内可选点的最大值即可,那对于路径上的点,可能作为答案的一定是深度最深的可选点,直接线段树上二分查找。总体复杂度 \(O(n\log^2n)\)

好题分享2

CF1844G Tree Weights

给你一棵节点编号为 \(1∼n(2≤n≤10^5)\) 的无根树,每条边有未知的正整数边权。现在对于所有的 \(1≤i<n\),给出点 \(i\) 到点 \(i+1\) 的距离 \(d_i​(1≤d_i​≤10^{12})\),请你还原出任意一组合法的边权或输出 \(−1\) 报告无解。

神仙构造题,考虑树上距离计算式 \(dis(i,i+1)=dep_i+dep_{i+1}-2*dep_{LCA(i,i+1)}\),这里 \(dep_i\) 代表 \(i\) 到根的距离,选定 \(1\) 为根,我们就有 \(dep_1=0\) ,那么我们就可已根据上式推出在 \(\mod 2\) 意义下 \(dep\) 的值,同理我们可以用 \(\mod 2\) 意义下的 \(dep_{LCA(i,i+1)}\) 来求出 \(\mod 4\) 意义下的 \(dep\) ,一直递推到 \(\mod 2^60\) 意义下,最后判断是否合法即可。

「ROI 2025 Day2」沼泽里的青蛙

一个平面上有 \(n\) 个点,每个点可以到达与它距离不超过 \(r\) 的点,判断网格图上每一个点是否能到达一个奇环。

网格图问题的一个经典 \(tirck\) ,对网格图进行分块,来减少信息量,一个点可以到达的点为于以 \(r\) 为半径的圆内,我们考虑把网格图划分为若干以 \(\frac{r}{2}\) 为边长的正方形,这样我们可以保证每个块内的点都可以相互到达,每个块内也就形成了一个完全图,一个块内点数 \(\ge 3\) 那就一定存在奇环,我们规定块内点数 \(\ge 3\) 的为重块,\(\leq 2\) 为轻块,一个点所有可能到达的点一定位于周围 \(5*5\) 的块内,而且重块内已经有奇环,不需要再和其他重块连边,所以每个重块内的点最多和 \(25\) 个轻块内的点连边,轻块内的点最多和 \(25\) 个轻块连边,这样就保证了边数为不超过 \(25n\) 最后再奇环染色即可

[POI 2013] CEN-Price List

给定一张图,每条边的边权均为 \(a\) ,同时图上恰好经过两条边到达的点之间有一条长度为 \(b\) 的边,求点 \(k\) 到每个点的最短距离。
\(n,m\leq 1e5\)

我们考虑 \(k\) 到点 \(i\) 的最短路会形如什么样,

好题分享4

又是听不懂的一天

CF1761G Centroid Guess

给定一棵 \(n\) 个点的树,保证重心唯一。
你可以询问不超过 \(m\) 次任意两点的距离。
求出树的重心。
$ n\le 7.5×10^4,m=2× 10^5$

很神的思路,假设我们现在已经知道一条经过重心的路径两个端点 \(S,T\) ,我们该如何求出重心确切的点。
我们观察一个点 \(i\)\(S\) 的距离和到 \(T\) 的距离之间的关系。
\(S\)\(T\) 的路径抻直,那从\(i\)\(S,T\) 一定会经过 \(S,T\) 路径上的一同一个点,那我们就可以根据\(dis(i,S),dis(i,T)\) 求出点\(i\)\(S,T\)路径上的投影点。特别的,当\(dis(i,S)+dis(i,T)=dis(S,T)\) 该点则为路径上投影点自身。这样我们就求出了每个投影点的子树大小和点的编号,由重心的性质可知,这条路径上第一个前缀和大于\(\frac{n}{2}\) 的点即为重心,这样我们就可以通过 \(2n\) 次操作求出树的重心。

上述是在已知一条经过重心的路径的前提下,现在的问题就是如何找到一条经过重心的路径。我们初始随机选一条路径,考虑通过调整找到一条经过重心的路径,包含重心的投影点的子树大小一定大于\(\frac{n}{2}\) ,我们可以找到路径上子树大小大于\(\frac{n}{2}\) 的点,在这个点的子树中随机选一个点,一定有 \(>\frac{1}{2}\) 的概率选到一条经过重心的路径。
我们发现每次调整路径时,并没有必要对 \(n\) 个点进行查询,只需要随机选取若干点查询即可,但这样又会有一些小问题,当我们 \(S\)\(T\) 的路径本就经过重心时,通过随机选点查询的调整,在特殊数据下会有不小概率把重心扔掉。对于这个问题,我们可以通过判断保留哪个端点,来使这一概率降到极低,具体的还是由重心的性质,我们根据 \(S\)\(T\) 侧,哪边的的采样点更多来确定保留哪一端点。

posted @ 2025-06-23 10:00  shanganze  阅读(16)  评论(0)    收藏  举报