2025.6.27 模拟赛
6.27 模拟赛
geemu
发现 \(1\) 和 \(n\) 是特殊的,自然的,考虑每次找到 \(1\) 和 \(n\),把它们删去,然后递归子问题。
暴力找就是检验 \(f(U-x)=1\) 是否成立,期望 \(O(n^2)\) 次询问。
每次 check \(1\) 个数还是太傻了,我们希望能够每次 check 一个集合里有没有 \(1\) 或 \(n\),这样就可以二分了。
稍微推一下就能得到:
- \(f(S)=f(U-S)+1\),\(S\) 中有 \(1\) 和 \(n\)
- \(f(S)=f(U-S)\),\(S\) 中有 \(1\) 或 \(n\)
- \(f(S)=f(U-S)-1\),\(S\) 中没有 \(1\) 也没有 \(n\)
注意到我们可能需要查询 \([l,r]\) 的补集,似乎需要进行交换。但注意到我们本质只是想知道 \([l,r]\) 与 \(\{1,n\}\) 的交集大小,可以用 \([1,r]-[1,l-1]\) 来表示。也就是说现在我们只需要算 \(S=[1,r]\) 的答案,它的补集就是 \([r+1,n]\),不需要任何交换。
直接二分即可,在两边各有一个的时候直接二分找到位置,然后判断哪个是较小值即可。
color
考虑拉出 \([l,r]\) 内点的虚树(包括边上的点),要求虚树值域也是 \([l,r]\)。
显然 \([l,r]\) 的虚树等于 \((i-1,i),i\in [l+1,r]\) 的路径并。于是可以求出 \((i-1,i)\) 路径最大值 \(mx_i\) 和最小值 \(mn_i\),条件等价于 \(\forall i\in [l+1,r],l\le mn_i< mx_i\le r\)。两边是独立的,预处理 \(lft_r\) 和 \(rgt_l\) 表示 \(\min l,\forall i\in [l+1,r],mx_i\le r\) 和 \(\max r,\forall i\in [l+1,r],mn_i\ge l\),则 \(f(l,r)=[lft_r \le l \And rgt_l \ge r \And a_l=a_r]\)。
对于出现次数很少的颜色,可以暴力找 \(f(l,r)=1\) 的数对,直接二维数点,点数是 \(O(nB)\) 的。
对于出现次数多的颜色,每个颜色对右端点做一遍扫描线,维护每个左端点对应的合法区间数量。
实测取 \(B=10^4\) 不需要分块平衡就能过。

浙公网安备 33010602011771号