点分治
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
HDU 5977 Garden of Eden(点分治)
传送门 点分治还是比较明显的啊… 找中心分治,每次从重心先搜索出所有路径的苹果状态 然后对每一个状态求答案,设当前状态是xxx 那么枚举xxx的子集sxsxsx,状态((1<<k)−1)⊕sx((1<<k)-1)\oplus sx((1<<k)−1)⊕sx就是满足条件的另一条子路径,合并就好了 但是一条路径可能会被算多次,所以需要容斥原理 加上经过重心的路径 减去经过儿子节点的路径 #include <bits/stdc++.h> using namespac原创 2021-01-31 17:01:57 · 227 阅读 · 0 评论 -
P4178 Tree(点分治+容斥)
传送门 先点分值,求重心分治下去 然后考虑如何计算点uuu的贡献 首先我们暴力计算出uuu子树中到uuu的所有距离放在数组里 排序后,双指针可以快速计算多少条路径的拼接小于等于kkk 但是会有重复,存在两条路径都在一颗子树内部 那就容斥,对子树也计算一遍,减去子树的答案即可,减去的都是多加的 #include <bits/stdc++.h> using namespace std; const int maxn = 2e5+10; struct edge { int to,nxt,w; }d[原创 2021-01-27 22:53:11 · 304 阅读 · 4 评论 -
P2634 [国家集训队]聪聪可可(树dp或点分治)
传送门 这题如果用树型dpdpdp就是一个煞笔题了,不过把这个当作模板题来熟悉一下点分治。 由于树上路径只有两类,一类经过当前点,一类不经过 经过自己的就去暴力遍历,不经过自己的给到儿子去遍历 这样复杂度是O(n2)O(n^2)O(n2) Ⅰ.找到树的重心rootrootroot,从rootrootroot开始分治 Ⅱ.累加通过点rootrootroot的路径数量 Ⅲ.在图中删掉rootrootroot,同时分治处理rootrootroot的每个子树,返回第一步 现在考虑如何累加通过点rootrootroo原创 2021-01-27 21:46:35 · 234 阅读 · 0 评论