Loading

Ynoi 杂题选做。

我要加训 ds。

Ynoi2011 成都七中

标算其实是点分树上直接做,但是我并没有很懂阅读了下其实实际和后面的做法差不多。

先只考虑 \(l\) 的限制,将树边边权设为 \(\min(u,v)\),直接跑 Kruskal 重构树,于是 \(x\) 所在连通块就是重构树上的一个子树(子树根可以通过倍增跳上去找到)。

\(r\) 限制同理,于是所求即为同个点集构成的两棵树的子树的交中颜色数。离线下来,对第一个树跑 dsu on tree,对第二个树只需要维护单点加入/删除和子树查询颜色数,直接拍平到 dfn 序列上是双 \(\log\) 的,但是考虑子树查询所以做一步类似树上差分的事情,加入时在和同颜色前驱、后继的 lca 上贡献减一,在这两个 lca 的 lca 上贡献加一即可,于是只需要一个 bit 即可。算上第一个树上 dsu on tree 的复杂度,总复杂度为 \(O(n\log^2n+m\log n)\)可以通过

Ynoi2003 铃原露露

发现对于同一个 \(z\),若 \([x1,y1+1) \subset [x2,y2+1)\),则 \([x2,y2+1)\) 的限制一定是没用的,根据支配点对的结论你对于每个 \(x\) 只需要找它的前驱后继点作为 \(y\) 即可,搭配 dsu on tree,你就只剩下了 \(O(n\log n)\) 个限制。

具体来说对于每个限制形如一个矩形内所有 \([l,r+1)\) 是不合法的,于是可以矩形加,然后判断一个 \([l,r+1)\) 是否合法就是它对应的点是否为 \(0\),那查询 \([L,R+1)\) 的子区间合法个数即为数子矩形 \(0\) 个数,考虑经典转化变成历史最值个数,线段树维护即可。

历史和问题可以先写成矩阵乘法然后再删去无用的位置。

posted @ 2025-01-17 11:13  山田リョウ  阅读(84)  评论(0)    收藏  举报