Link
Solution
良心出题人。。写一个LCT再写一个裸主席树再写一个暴力就给85pts。。
正解启发式。启发式真是好,好写又不慢。。
如果没有Link操作,直接树上主席树(见CLJ论文)。
对于Link操作,采用把小树合到大树里面去的方法。小树所有节点的主席树都暴力重建。
查询的时候要求LCA。因为是动态地连接,只能用倍增(可以不用吗??)。因此在之前的DFS中搜到每个点都预处理一下数组。
对于一个点,重建一次的代价是(主席树+倍增)。一个点至多被重构次:因为每次重构,这个点所在的子树的大小都至少扩大了一倍,所以最多次操作就能这个点与其它所有的点连成一棵树了。类似并查集的按秩合并。
一开始WA了,然后RE了。因为数组没有彻底清零,写成了
1
if(!(fa[pos][i]=fa[fa[pos][i-1]][i-1])) break;
Tips
倍增LCA数组重建之后一定要彻底清零。。
Code
1 | //Code by Lucida |