终于入坑长链剖分了。以前只知道思想但是不会写代码。(因为有些细节没想明白,突然今早睡醒在梦中理解了x
因为要O(1)O(1)O(1)继承重儿子的信息,我们可以使用主席树/指针/vector来实现。
主席树的话就是直接把重儿子的链直接给就完事了。
指针的话非常轻松,每次直接给这条链分配一块内存,每次重儿子移位就好了,轻儿子的内存重新分配。
vector的话可能需要倒序,有点蛋疼,每次直接使用重儿子的vector,但是插入自己的信息的时候又不能在开头插入,于是只能倒着存信息,每次在结尾处push_back。
于是我扔掉了vector的写法。
这题非常裸,直接上然后维护ans就好了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int const N = 1e6 + 5;
vector<int> G[N];
int dp[N];
int *f[N], *cur = dp;
int len[N], son[N], ans