NOI2023 补题小记

Day1 T1 方格染色

\(t=1/2\) 的操作可以维护矩形面积并.当 \(n,m \le 1e5\) 时考虑直接将每条斜线拆成 \(x_2-x_1\) 个矩形.所以朴素的矩形面积并即可通过 \(95\%\) 的测试数据.

\(n, m \le 1e9\) 时,先沿用之前的思路将 \(t=1/2\) 的操作覆盖的面积求出来.然后考虑斜线.首先判掉位于同一条直线上并且有交集的斜线,将它们连接成一条.这时任意两斜线和斜线或斜线和直线之间都至多仅存在一个交点.

顺序考虑每条斜线——先将其长度计入答案,再在考虑从答案中去掉它和 \(t=1/2\) 的操作及之前的斜线的交点.

Day1 T2 桂花树

由于限制 1 保证了 \(T'\) 选点集 \([1,n]\cup Z\) 作为关键点求出的虚树等于 \(T\),构造 \(T'\) 的过程可以视作在 \(T\) 上插入 \(m\) 个新点(每个点可以作为叶子插入或者插入到一条边的中间).

考虑沿用虚树来描述限制 2.发现限制 2 可以描述成:\(\forall i \in [1, m]\)\(T'\) 选点集 \([1, n+i]\cup Z\) 求出的虚树不能包含编号 \(>n+i+k\) 的节点.

不妨顺序插入节点 \(n+1 \sim n+m\).设当前要插入节点 \(x\).若作为叶子插入,则有 \(x-1\) 种选法;若插入到某条边的中间,则有 \(x-2\) 种选法.最后还有一种情况,即作为某条边中间编号大于自己的节点的儿子,有 \(x-2\) 种选法,这种情况下会诞生一个以后需要填补的空位.考虑 \(k \le 10\),我们可以将空位诞生的时间长短状压起来.

\(f_{i, S}\) 表示插入节点 \(i\),待填补的空位集合为 \(S\)

存在转移:

\[\begin{aligned} f_{i, S} &\rightarrow f_{i+1, (S-t)+1}\ (t\in S) \\ (2i-3)f_{i, S} &\rightarrow f_{i+1, S+1}\\ (i-1)f_{i, S} &\rightarrow f_{i+1, \{S\cup 0\}+1} \end{aligned} \]

分别表示填补空位、插入叶子或边的中间、作为之后节点的儿子.

Day1 T3 深搜

还不会.QwQ

Day2 T1 贸易

\(1\) 类道路指向父亲,第 \(2\) 类道路指向子树内的节点.观察到对于点对 \((u, v)\)\(u \rightarrow v\) 的路径必然经过 \(lca(u, v)\).我们考虑将路径挂在 \(lca\) 处统计.即对于每个点 \(u\) 考虑 \(\sum_{lca(x,y)=u}dis(x, y)\)

考虑 \(u\)\(lca\).则 \(dis(a, b)\) 可以被分成两部分:\(a \rightarrow u,u \rightarrow b\).设计 \(up(y)=\sum_{x \in sub(y)}dis(x, u), dn(x)=\sum_{x \in sub(y)} dis(u, x)\)\(sizdn(x),sizup(x)\) 分别表示 \(u\)\(sub(x)\) 中可达和可被达节点的数量.那么这里的答案可以统计为

\[up(ls_u)sizdn(rs_u)+dn(rs_u)sizup(ls_u)+up(rs_u)sizdn(ls_u)+dn(ls_u)sizup(rs_u)+dn(u) \]

发现其中比较难求的形式是 \(dn(x)\).我们考虑将 \(u\) 的子树和 \(u\) 的祖先链单独拿出来做 Dijkstra 暴力求.

分析时间复杂度:复杂度瓶颈在 Dijkstra.考虑 Dijkstra 的复杂度为 \(O((n+m)\log n)\).对于每点 \(x\),其作为祖先被加入的次数是 \(siz(x)\) 次,同样其加入自己子树会贡献一个 \(siz(x)\).故点对复杂度的贡献为 \(\sum_{x}siz_x\log n=n\log^2n\).再考虑边.以 \(x\)\(lca\) 时,我们只将 \(e(a,b),(b\in sub_x)\) 的边加入 Dijkstra 算法中,故一条边最多会被统计 \(\log n\) 次.故边对复杂度的贡献为 \(m\log^2 n\).整个算法的复杂度为 \(O((n+m)\log^2 n)\)

Day2 T2 字符串

一组问题形如:查询以 \(i\) 开头的子串数量,满足长度不超过 \(r\) 并且子串的回文串字典序大于原来子串的字典序.

快速比较若干子串对的字典序貌似比较困难,可以将问题放宽一点,尝试比较一个后缀和若干前缀的反转的字典序.具体来说,我们将比较 \(S[i:l]\)\(S[i+l:i+2l-1]^R\) 转化成比较 \(S[i:n]\)\(S[1:i+2l-1]^R\),那么有:

  • 在多组比较中,其中的一个串是固定的 \(S[i:n]\)
  • 作比较的另一个串,也就是前缀的结束位置在奇数或偶数处形成了一个区间.

为了让问题形式变得更美观,我们考虑将 \(S^R\) 拼接到 \(S\) 的后面形成新串 \(T=SS^R\).发现问题又变成了比较一个后缀和开始位置位于一个区间中的后缀的字典序关系:
挂了么 QwQ

发现比较 \(A\)\(B\) 相当于比较 \(A\)\(C\)

我们使用后缀数组求出每个后缀的排名,记作 \(Rk\).一组询问 \((i,r)\) 相当于询问满足如下限制的后缀 \(suf_p\) 数量:

  • \(p\in[2n-i-2r+2,2n-i]\)
  • \(p\mod 2\equiv i\)
  • \(Rk_p>Rk_i\)

这是一个二维数点问题.离线可以使用树状数组解决.


考虑将 比较子串 放宽为 比较后缀 会带来的多余贡献.

\(S[i:i+l-1]\)\(S[i+l:i+2l-1]^R\) 完全相等的时候,这个位置不能被统计到答案里.但由于我们比较的是后缀,可能就会存在 \(Rk_{2n-i-2l+2}>Rk_i\) 然后被统计到的情况.出现这种情况的时候,有 \(S[i:i+2l-1]\) 为回文串.那么我们要去掉的是一类以 \(i\) 开头的回文前缀使得其可能被统计入答案.但是我们考虑对于回文中心相同的回文串,其对应的两个后缀比较结果相同:
这张挂了么 QwQ

比较绿色回文串对应的两后缀(蓝色箭头)和比较红色回文串对应的两后缀(灰色箭头)本质上是在比较黄色箭头对应的两后缀.因为回文部分是相同的,我们直接跳过不比较也不会对比较结果产生影响.

考虑预处理每个回文中心的极长回文半径.并在极长回文半径处检查,这个中心的回文串是否可以被统计入非法答案.对于一组询问需要减去的非法贡献就是位置在 \(i\) 之后,并且极长回文半径可以达到 \(i\) 的,可以被统计入非法答案的回文中心个数.这也是二维数点问题.

Day2 T3

神秘.也不会.QwQ

posted @ 2023-11-24 07:39  ckain  阅读(65)  评论(0)    收藏  举报