2024.10.23-25 杂题
P7323 [WC2021] 括号路径
如果存在 \((a,b,w)\),\((c,b,w)\)。那么 \((a,c)\) 就是一条合法路径。所以把 \(a,c\) 放入一个集合。然后合并新的的时候把 \(w\) 一样的合并了就行。最后统计每个"块"的数量,答案就是 \(\sum_{i=1}^{n} C_{cnt_i}^{2}\)
复杂度 \(O(m \log n)\)
P11210 『STA - R8』强制在线动态二维数点
询问操作要定位四点构成的矩阵,很麻烦。
所以如果令点 \((r,l)\) 表示区间 \([l,r]\),对于询问操作,就是一次询问 \([l,r]\)
转换定义后,每一次询问,对于合法的 \((x_0,y_0)\),找到 \(k=\min_{x_0≥l}y_0\),最后答案为 \(\min_{k≤y≤r}y-x\)。该操作可以用两颗维护区间最小值的线段树维护。
修改操作,使用 multiset
存储每个左(右)端点对应的右(左)端点的集合。现在的修改操作在原线段树单点修改然后修改 multiset
里的端点即可。
复杂度 \(O((n+q) \log n)\)
P11220 【MX-S4-T4】「yyOI R2」youyou 的三进制数
前两个性质是互逆的,后两个性质也是互逆的,考虑无向边建图。
一个三元组 \((x,y,z)\) 是“好的”,需要存在一条从 \(z\) 开始的简单路径,它根所有从 \(x\) 到 \(y\) 的简单路径有且仅有一个交点。反证法即可证明。
建出圆方树,必经之点就是树上 \(x\) 到 \(y\) 路径上的所有圆点,称这些点为关键点。定义一个点是路径上的点当且仅当存在一条从 \(x\) 到 \(y\) 的路径经过这个点。
对于一对 \((x,y)\),能对 \(z\) 产生贡献当且仅当,\(z\) 是关键点但是不是路径上的点,存在一条从 \(z\) 开始的简单路径能在不经过任何其他路径上的点的情况下到达任意一个关键点。
令 \(siz_x\) 表示圆方树上以 \(x\) 为根子树的圆点数量。比如我们当前 dfs 到子树 \(t\),,把 \(t\) 当作根,对于节点 \(t\) 的两棵子树 \(x\) 和 \(y\),它会对其他所有除了这两棵子树内的点造成 \(2\times siz_x\times siz_y\) 的贡献。也就是对整棵树加上这个贡献,再对这两棵子树减去这个贡献,树上差分。
总复杂度 \(O(n)\)
P8393 [BalticOI 2022 Day2] Stranded Far From Home
可以不使用克鲁斯卡尔重构树
一个点想要说服一个比自己大的村庄,就必须要说服别的村庄提高自己的势力。但问题在于,提高的极限就是说服自己子树内的村庄?并不是,我们可以 \(a\) 说服完 \(b\),然后 \(b\) 去说服 \(c\),所以,只要比自己的小的,都有机会说服(注意不是一定)。将所有的点按照点权排序然后将原来的树重建一下,对于新图,统计处每个节点的子树和 \(s[]\),如果 \(s_y≥a_x\) 就说明可以说服。
瓶颈在于排序,复杂度 \(O(n \log n)\)
P3565 [POI2014] HOT-Hotels
三个点距离相等等价于深度较深的两个点的 \(lca\) 到三个点的距离相等。所以将 LCA 拎出来使三个点在同一深度就可以计算了。\(O(n)\) 枚举这个 LCA 然后 dp 同一深度,期望算法复杂度 \(O(n^2)\),可做。
最终要求的答案是三个点的方案数,设 \(f[i]\) 表示两个点的方案数,\(g[i]\) 表示一个点的,\(cnt\) 表示该深度所有点的个数。那么转移就很简单了,\(cnt\) -> \(g\), \(g\) -> \(f\), \(f\) -> \(ans\)
复杂度 \(O(n^2)\)
CF1009F
DSU on tree 板子题
第一次 dfs 先求出重儿子。mp[i][d]
表示节点 i
的子树中的节点中深度为 d
的数量。第二次 dfs 计算答案。
复杂度 \(O(n \log n)\)
P3523 [POI2011] DYN-Dynamite
\(K\) 显然是单调的,二分答案 \(K\)
dp 检查条件,设 \(f[i]\) 表示以 \(i\) 为根节点的子树中没有被覆盖的最远的点。设 \(g[i]\) 表示以 \(i\) 为根的子树中距离 \(i\) 最近的已设立的点。转移是显然的。
\[f[x] = max(f[x], f[y] + 1) \]\[g[x] = min(g[x], g[y] + 1) \]然后处理一下特殊情况即可。
复杂度 \(O(n \log n)\)
P3554 [POI2013] LUK-Triumphal arch
同样是二分答案
设 \(f[i]\) 表示在 \(i\) 的子树中不包括 \(i\) 还需要染色的次数。
求出子节点 \(f_i\) 的和记为 \(sum\),同时 \(f_i=sum+d_i-k\),\(k\) 为二分检查的值,\(d_i\) 表示度数。为了方便计算,在求 \(sum\) 的时候对于每次加 \(f_y\) 可以额外加一个一就不用统计 \(d_i\) 了。最后如果 \(f[1]=0\) 更新答案。
复杂度 \(O(n \log n)\)
P8917 [DMOI-R2] 风神瞳
设 \(f_{x,t,i}\) 为从 \(x\) 还需要向叶子节点跳 \(t\) 步收集 \(i\) 个风神瞳最少花费。
在 dfs 时对于 \(x\) 的子节点 \(y\):
-
\(f_{x,t,i}= f_{x,0,i-j}+f_{y,t-1,j}+1\)
-
\(f_{x,t,i}= f_{x,t,i-j}+ \min \{f_{y,0,j}+2,\min_{p=\max \{k-dep_x+1,1\}}^{k}{k-p+1+f_{y,p-1,j}+1 \}}\)
复杂度 \(O(nmk)\)
标签:25,2024.10,子树,log,复杂度,路径,record,杂题,节点 From: https://www.cnblogs.com/spaceswalker/p/18501785