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\) 不需要分块平衡就能过。

posted @ 2025-06-30 20:32  Cindy_Li  阅读(10)  评论(0)    收藏  举报