2025.6.11 模拟赛
6.11 模拟赛
xor
key:区间在 01 trie 上拆成 \(\log\) 个子树
(高位前缀与 \(a\) 或 \(b\) 相同,有一位不同,低位任选)
考场上可能注意到了这个东西,然而不知为何把它抛在脑后了...
有这个任选的限制是非常好的,注意到如果有一个连续段 \([l,r]\) 在 \(j\) 这一位上都是任选,则 \([l,r]\) 对 \(j\) 这一位没有任何贡献。
考虑区间 dp,只需枚举当前位一个恰好“与 \(a/b\) 不同”的位置进行转移。
具体的,记 \(f(d,l,r,cl,cr,tl,tr)\) 表示第 \(d\) 位,区间 \([l+1,r-1]\) 任选,\(x_l/x_r\) 前缀与 \(a/b\) 相同,这一位与 \(a/b\) 相同/不同。
枚举分界点 \(p\),记忆化搜索。
meow
考虑构造给定的 \(v\) 序列:先按 \(v_i\) 从小到大排序,这就是后半部分,而后贪心的构造前半部分。
考虑什么样的序列是无法构造的:
- 若 \(v_{v_i}<v_i\) ,后半部分中 \(v_i\) 会在 \(i\) 前面出现,不符合 \(f\) 的定义。
考虑连边 \(i\to v_i\),则要求一条链要么一直向后,要么第一条边向前,然后一直向后。
设 \(dp(i,j,k)\) 表示考虑前 \(i\) 个,有 \(j\) 条向后连的,其中 \(k\) 条没确定指向的点。则 \(i\) 要么向前指向一个向后连的(\(j\) 种),要么向后连。且前面没确定指向的点可以有 \(a\) 个确定指向 \(i\)。
注意到因为枚举 \(a\) 且系数带 \(k,a\) 相关组合数,复杂度只能做到 \(n^4\)。
考虑换一种状态设计,\(dp(i,j,k)\) 表示前 \(i\) 个,前面有 \(j\) 个向后连的,后面有 \(k\) 个向后连的,则可以直接确定 \(i\) 指向的点。
两种转移 \((i,j,k)\to (i+1,j,k)\),\((i,j,k) \to (i+1,j+1,k-1)\),初始状态 \((0,0,*)\),结束状态 \((n,*,0)\)。
Interesting DS - QOJ2559
首先离散化后考虑单位区间。
把所有区间按照右端点从小到大、左端点从大到小排序。此时若无包含,则一定是 \(L_i\le L_{i+1},R_i\le R_{i+1}\),即包含某个单位的所有区间下标连续,容易线段树维护长度和当前最短的区间。
在有包含时,注意到由于 \(R_i-L_i\le R_j-L_j(i<j)\),则若 \(L_j\le L_i<R_i\le R_j\),\(j\) 一定比 \(i\) 后被选到。
于是我们需要动态维护没有包含其他区间的区间集合 \(S\)。
注意到 \(S\) 其实就是排序后,左端点的所有前缀 \(\max\) 位置。删除一个区间,记它的前驱、后继为 \(pre,nxt\),则新增区间一定在 \((pre,nxt)\) 之中。每次找前缀 \(\max\) 位置,\(\le pre\) 就退出,否则加入区间并继续。

浙公网安备 33010602011771号