【BZOJ4009】接水果(整体二分,扫描线)
题面
题解
看到这道题,感觉就是主席树/整体二分之类的东西
(因为要求第
\(k\)大)
但是,读完题目之后,我们发现路径之间的包含关系很不好搞
那么,我们来画画图
这是第一种情况,
\(lca\)不是
\(u,v\)\(u,v\)分别是一个盘子的两端
如果被一个水果完全覆盖,
那么,这个水果的两端分别在
\(u,v\)的子树中
设
\(dfn[u]\)是
\(u\)的
\(dfs\)序
\(low[u]\)是子树中最大的
\(dfn\) 那么,设水果两端分别为\(a,b\)
\[dfn[u]\leq dfn[a] \leq low[u],dfn[v]\leq dfn[b]\leq low[v]\] 再看第二种情况
也就是说,此时\(u\)是\(lca\)
那么,一个点还是在
\(v\)的子树内
另一个点在这条链的子树外
设
\(u,v\)链上的
\(u\)的儿子为
\(w\) 那么,水果的一个点一定不在
\(w\)的子树内
也就是说:
\[dfn[v]\leq dfn[a]\leq low[v]\]\[dfn[b]<dfn[w]\ or\ low[w]<dfn[b]\] 好的
现在知道了这些,有什么用???
如果我们把盘子的
\(dfn[u],dfn[v],low[u],low[v]\)看成两个点
组成了一个矩形
那么,水果的
\(dfn[a],dfn[b]\)就是一个点
所以,一个水果如果被盘子所完全覆盖
那么,也就是水果组成的点被盘子组成的矩形所包含
所以整体二分+扫描线求解就很容易做了
#include #include #include #include #include #include #include #include