dmy 2.28

推歌:39

我说 dmy 是良心机构!!学校停电给我们免费升酒店!我将永不诋毁 dmy!!

依旧早上先模拟赛!今天是 xqw 大哥组的题。

A

原:QOJ17177

首先是一些比较不用脑子的部分分!
sub1,2,4:每次询问扫一遍每组元素,然后检查 \(b\) 的值域分几段,对于每个连续段再扫 \(a\)。为了方便可以对 \(b\) 离散化,非连续的值中间空 \(1\) 即可,离散化后极限值域 \(2n\) 可行,共获得 \(32\) pts。
sub3:判最小值是否 =1,最大值是否 <=n,然后询问离线上莫队即可,共获得 \(16\) pts。
sub5:判断是否有 a_i=1,若有 a_i=1 且没有 b_i=1 则无解,否则必定有解,共获得 \(4\) pts。

以上部分拼包可以获得 \(52\) pts,然后是正解。

依旧离线,观察到有解当且仅当所有 \([a_i,b_i]\) 的并等于集合 \(\{b_i \}\),相当于从前往后遍历,每扫到一组 \(a_i,b_i\),相当于给 \(x=b_i\) 提供了一个支撑点,同时 \([a_i,b_i)\) 内的每个数都需要一个支撑点。考虑怎么维护这个东西。

用一个树状数组维护每个位置的支撑点出没出现过,如果出现过那么最晚在哪个位置出现的,这个每次只需要修改一个值就好。还需要维护每个位置是否需要支撑点,如果需要那么最晚在哪个位置需要,由于这里的值域有 \(10^9\) 所以上珂朵莉树。

接下来考虑查询,每次要对每个询问左端点计算有多少个需要支撑点但没有支撑点的位置。同样开一个树状数组来算。此时考虑树状数组应该更新的部分:对于要修改的所有支撑点出现位置比需要该支撑点的位置晚的点单独更新,因为支撑点出现位置只会被修改 \(n\) 次,而这种情况只会在修改一次后至多出现一次所以可以暴力做,新出现的支撑点修改之后要去掉原来有但现在已经不需要的贡献。对着这个朴素做即可,代码非常好写。

还有若干种做法,但是感觉都好复杂?!大学习!

群聊天记录:
:所以 T1 2.5e5 3s 是鼓励根号各显神通吗

群聊天记录:
:冷知识 真实的省选也可以写复杂度根本不对的做法乱日

B

原:QOJ17176

xqw:这个题很简单啊!(?

没有脑子的部分分:前两个包,sub2 的答案就是树的高度,sub1 除了 \(n=7\) 完全二叉树的情况都包含在 sub2 内,\(n=7\) 单独拉出来讨论一下就结束了,可以获得 \(20\) pts。

观察 sub3,只需要判断能不能把所有边按照原长塞进去。这是一个贪心,考虑从下往上贪,我们发现需要一个非常简单就可以判断有没有解的条件。贪心的方法是很简单的,思考结论。结论是第 \(i\) 层的点数小于等于宽度等价于有解。我们把每条边拿出来就可以算出每一层有多宽,挨个查就是对的。

于是我们思考从下往上遍历,对于每个节点考虑其两个子树,发现对于某个深度有解的条件还是上面那条。于是我们线段树维护每个子树的宽度 - 节点数的值,对着这个东西做线段树合并然后判有无解,最后会得到一颗线段树,找到第一个值 \(>0\) 的位置即可(应该是这样吧?)

不知道我写的对不对,放一个 fqd 大神的题解,膜拜空指针喷雾瓶大神。

C

经典结论:如果要比较两个无穷循环字符串 \(A\)\(B\) 的大小,只需要比较 \(AB\)\(BA\) 的大小就好了。

我们取 \(s=a_{[l_i,r_i]}\),先扔掉 \(t\) 不是 \(s^{\infty}\) 前缀的情况,这个可以在后缀数组上二分。然后考虑:如果一个串是 \(s^{\infty}\) 的前缀,那可能无法在一倍串长内判断。

先在原串里找一个最长的串 \(t\),其是 \(s^{\infty}\) 的前缀。它应该是 \(t=s^ku\) 的结构,那么 \(t^{\infty}\)\(s^{\infty}\) 的关系等价于 \(u^{\infty}\)\(s^{\infty}\) 的关系。设 \(s=uv\),根据我们的经典结论,两个无穷串的关系等价于 \(su\)\(us\) 的关系,等价于 \(vu\)\(uv\) 的关系。若 \(v\) 不是 \(s\) 的前缀,则其等价于 \(v\)\(s\) 的大小关系,可以二维数点,两维分别是后缀的字典序和后缀的开始位置。

\(v\)\(s\) 的前缀,那么继续取 \(s=vw\),注意到 \(|u|=|w|\),如果再出现 \(w\)\(s\) 的前缀,那么 \(w=u\) 不计数。

所以以上证明了:对于 \(u\)\(s^{\infty}\) 的前缀,我们至多向后看一次循环就可以判断 \(u^{\infty}\)\(s^{\infty}\) 的大小关系。然后就可以做出 \(type=1\) 的特殊性质,即 \(s^2\)\(a\) 中是存在的,拿出来上后缀数组就可以变成二维数点。

但是如果不存在,我们就只能找到一个字符串 \(ss'\),其中 \(s'\)\(s\) 的前缀。拿这个直接算是会算错的,所以考虑什么时候会算错。我们发现如果会算错那么至少要满足 \(s=uv\)\(v\)\(s\) 的前缀,即 \(v\)\(s\) 的 border。

于是我们又有一个经典结论:一个字符串所有的 border 长度可以分成 \(\log\) 个等差数列。我们可以分出若干个等差数列,每个在比较的时候都形如 \(s=xy,xzy,xz^2y,\cdots\)。这个东西是单调的,所以还是可以二分(单调的方向不一样要单独判)单个等差数列是单 \(\log\) 的,这部分总复杂度就是 \(q\log^2\) 的,总复杂度是 \(O(n\log n+q\log^2 n)\)


接下来是题!伟大的 CTS!

QOJ17203 迷题 II

何大哥:不给思考了,因为这个题还是太离谱了。

开讲 30min 掉线了,听不明白思密达,放弃写题解了喵,直接看官解吧喵。

QOJ17206 信号连接

看起来就应该使用某 B 生成树算法!然后分析性质。

\(A_+\)\([l,r]\)\(a_i\) 最大的 \(i\)\(A_-\)\(a_i\) 最小的 \(i\)\(B_+,B_-\) 同理,\(w(i,j)\)\(i,j\) 之间的边权,即 \(min(a_ib_j,a_jb_i)\)

我们有:\(\forall i\in [l,r],\min_{l\le j\le r}w(i,j)=\min(w(A_+,i),w(A_-,i),w(B_+,i),w(B_-,i))\)。由此推论对 \(i\) 满足 \(a_i,b_i>0\),有 \(\min_{l\le j\le r}w(i,j)=\min(w(A_-,i),w(B_-,i))\)

我们有:仅考虑每个点与 \(A_+,A_-,B_+,B_-\) 之间的边,执行某 B 算法一轮,最多剩 \(2\) 个连通块,所以答案和 \(\sum_{i=l}^{r} \min_{l\le j\le r}w(i,j)\) 至多相差一项。

我们有:所有点极角排序之后每个象限所有满足 \(w(A_-,i)<w(B_-,i)\)\(i\) 形成一个连续段,所以上面的那坨式子可以排序之后主席树快速计算。

我们有:当只剩 \(2\) 个连通块时,分别对于两个连通块求出类似的关键点 \(A_+,A_-,B_+,B_-\),则必存在两个连通块之间的最小边,使得该边的两个顶点均为关键点。当我们取出原来的 \(A_+,A_-,B_+,B_-\) 并且把他们的自环和重边从上面那坨式子里减掉,然后讨论这些点的连通性。如果这四个点不连通再取出两个连通块共八个点,把最小的跨连通块的边加进去就行。

官解:实现时可能需要比较精细的讨论。

QOJ17204 渡船

有非常优美的特殊性质!!

首先看 \(k=1\),找一条路径就行,而这条路径显然是没有环的,搜一条出来即可。

然后是 \(k=n\)\(s_1,\cdots,s_n\)\(t_1,\cdots,t_n\) 都是排列。也就是每个点都有一个人且都是一个人的目的地。一次操作可以交换一条边相连的两个人的位置,所以拉一棵树出来就可以随便做了。

然后是 \(\{s_i\}=\{t_i\}\),考虑什么时候两个人能交换位置?如果两个人可达的点集交集非空则一定可以,否则一定不能。那多个人怎么办??多个人等价于多次两个人,所以把能换的人之间两两建边,一个连通块内可以任意重排,而只有一个连通块内可以重排,此时判定和构造都是简单的。

然后我们就会做了。这个东西看起来很向网络流啊!!汇点连到出发点,源点连到目标点,我们先要让一个集合的点全走到另一个集合内,所以取集合的对称差部分作为始终点,按照原图的方向建图然后直接流。如果可以满流那么点集就可以换过去,然后就按照 \(\{s_i\}=\{t_i\}\) 的方式做就好了!

QOJ17205 三色花园

吓哭了!

官解,写不动啊!

何大哥:前面还比较舒服,后面是史。

何大哥:我虽然也出过 \(t\le 10,k<3\) 之类的题,但我出的没有这么史。

posted @ 2026-02-28 15:41  Xuan_tmp  阅读(16)  评论(0)    收藏  举报