题目:http://uoj.ac/problem/55 https://www.luogu.org/problemnew/show/P3920 参考博客:https://www.cnblogs.com/Khada-Jhin/p/10078584.html 于是写了替罪羊树,但无论怎么调参都会T,UOJ上是80分. 别忘记给 vis 赋值!!! 更新答案和更新点分树一起做会错?总之分开写了: 注意空间. 代码如下: #include<cstdio> #include<cstring>…
意外的好写..... 考虑点分 \(dis(i, j) \leq r_i + r_j\) 对于过分治中心一点\(u\),有 \(dis(i, u) - r_i = dis(j, u) + r_j\) 对于同一子树内需要去重 原本是考虑用值域线段树来维护的,看了看\(10^9\)的范围,空间估计开不下 那就用平衡树吧... 用动态点分来维护答案,每次默认把\(i\)归到父亲的分治结构中 如果某个分治结构过于不平衡,那么就暴力重构 注意一下,一个点分治中的分治结构在树中对应一个联通块,没有任何其他的…
题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每个时刻它会长出一个新的叶子节点.每个节点上有一个可爱的小精灵,新长出的节点上也会同时出现一个新的小精灵.小精灵是很萌但是也很脆弱的生物,每个小精灵 i 都有一个感受能力值Ri ,小精灵 i, j 成为朋友当且仅当在树上 i 和 j 的距离 dist(i,j) ≤ Ri + R! ,其中 dist(i…
题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每个时刻它会长出一个新的叶子节点.每个节点上有一个可爱的小精灵,新长出的节点上也会同时出现一个新的小精灵.小精灵是很萌但是也很脆弱的生物,每个小精灵 i 都有一个感受能力值Ri ,小精灵 i, j 成为朋友当且仅当在树上 i 和 j 的距离 dist(i,j) ≤ Ri + Rj,其中 dist(i,…
每插入一个点,直接把它当做重心插入原树,当做是动态点分树一样维护 但这样深度会越来越大,所以我们用类似替罪羊的方法 当树失去平衡时,对子树进行一次点分,保证复杂度 #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <cctype> using namespace std; type…
洛谷题面传送门 神仙题. 首先看到这样两棵树的题目,我们肯定会往动态树分治的方向考虑.考虑每次找出 \(T_2\) 的重心进行点分治.然后考虑跨过分治中心的点对之间的连边情况.由于连边边权与两棵树都有关,直接处理这个"跨过重心"不太方便.不过注意到一个性质,那就是对于同一棵子树中的两个点 \(x,y\),如果我们直接将它们的边权设为 \(dep_x+dep_y+\text{dist}(x,y)\),其中 \(dep_x\) 为 \(x\) 到分治重心的距离,\(\text{dist}(…
题目:http://uoj.ac/problem/55 点分治.在点分树上每个点上用 splay 维护管辖的点的情况.做几次就重构点分树.TLE.只能过 20 分. #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; int rdn() { ;;char ch=getchar(); ;ch=getchar();} +ch-',ch…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ55.html 题解 做法还是挺容易想到的. 但是写的话…… 首先这种题如果只要求一棵树中的满足条件的点数(不需要在加点的同时维护答案),那么显然可以点分治: 假设当前点分中心为 x,设点 y 与 x 的距离为 d[y] ,然后,我们把 $d[a] + d[b] \leq r[a] + r[b]$ 移一下项,得到: $$d[a]-r[a]\leq r[b] - d[b]$$ 那么,我们只需要对于每一个点…
传送门 暴力思路就是每次点分治计算答案 点分治之后,条件可以变成 \(dis_i-r_i\le r_j-dis_j\) 每次只要查找 \(r_j-dis_j\) 的排名然后插入 \(dis_j-r_j\),随便拿个平衡树维护即可 考虑如果带修改,就是动态点分治,每个点维护两个平衡树,一个表示自己的贡献,一个表示上一层重心要减去的在同一棵子树的贡献 每次加入一个点就直接在父亲下面,暴力向上更新每一个重心的两个平衡树,顺便查询答案 求距离什么的直接暴力维护倍增数组就行了 现在的问题就是可能暴力向上更…
题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答案 转移的时候用总的方案减去相同颜色的方案 复杂度\(O(n^2 log^2 n)\) #include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 1001, INF = 1e9 + 10,…