P2703【WC2014】紫荆花之恋(强数据版)
问题描述
强强和萌萌是一对好朋友。有一天他们在外面闲逛,突然看到前方有一棵紫荆树。这已经是紫荆花废物的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来。
仔细看看的话,这棵大树实际上是一个带权树。每个时刻他会长出一个新的叶子节点。每个节点上有一个可爱的小精灵,新长出的节点上也会同时出现一个新的小精灵。小精灵是很萌但是也很脆弱的生物,每个小精灵i都有一个感受能力ri,小精灵i,j成为朋友当且仅当在树上i和j的距离dist(i,j)<=ri+rj,其中dist(i,j)表示在这棵树上i和j的唯一路径上所有边的边权和。
强强和萌萌很好奇每次新长出了一个叶子节点之后这棵树上总共有几对朋友。
我们假定这棵树一开始为空,节点按照加入的顺序从1开始编号。由于强强非常好奇,你必须在每次出现新的节点后马上给出总共的朋友对数不能拖延哦。
输入格式
输入文件共有n+2行。
第一行包含一个正整数T,表示测试点编号。
第二行包含一个正整数n,表示总共要加入的节点数。
我们令加入前的总工朋友对数是last_ans,在一开始时last_ans=0。
接下来n行中第i行有三个数ai,ci,ri,表示节点i的父亲节点的编号为(ai xor ( last_ans mod 109)),与父亲节点之间的边权为ci,节点i上小精灵的感受能力为ri。
注意a1=c1=0,表示1号点事根节点。对于i>=2,父亲节点的编号至少是1,至多是i-1。
输出格式
输出文件包含n行,每行输出1个整数,表示加入第i个点之后,树上共有几对朋友。
样例输入
0
5
0 0 6
1 2 4
0 9 4
0 5 5
0 2 4
样例输出
0
1
2
4
7
考虑点分治,一个点对合法仅当他们不在同一颗子树上且$dep[i]+dep[j]<=r[i]+r[j],dep表示点到根的距离$
移项得到$dep[i]-r[i]<=r[j]-dep[j]$,那么只需要维护$dep[i]-r[i]$的信息即可。
需要支持添加,查找比某个数小的数的个数,那么用平衡树。
查询点分治树上两点距离的时候在原树上暴力LCA查找即可。
关于加点,直接在点分治树上添加即可,然后进行链查询,链修改,但是这样可能使得点分治树非常的不平衡
采用替罪羊树的思想解决,设定常数$ki$,当过于不平衡时重构即可,这里$ki$大概取$0.8?$
复杂度$O(nlog^3n)$
1 |
|