rt,本来写的是先dfs处理完答案,大概长这样:
inline void Sum(int u) {
for (int i = hd[u];~i;i = e[i].nxt) {
if (e[i].to != fa[u][0]) {
Sum(e[i].to);
sgt._root[u] = sgt.Merge(sgt._root[u], sgt._root[e[i].to], 1, 100000);
}
}
}
inline void Solve() {
while (m--) {
int u = qread(), v = qread(), t = qread();
int l = Lca(u, v);
sgt.Modify(sgt._root[u], 1, 100000, t, 1);
sgt.Modify(sgt._root[v], 1, 100000, t, 1);
sgt.Modify(sgt._root[l], 1, 100000, t, -1);
if (fa[l][0]) sgt.Modify(sgt._root[fa[l][0]], 1, 100000, t, -1);
}
Sum(1);
/*
for (int i = 1;i <= n;i++) {
sgt.Dfs(sgt._root[i], 1, 100000);
puts("-----");
}
*/
for (int i = 1;i <= n;i++) {
printf("%d\n", sgt.qmax(sgt._root[i], 1, 100000));
}
}
然后就 WA 15pts,把题解拿下来发现最后的线段树形态也非常奇怪
然后改成算完立刻取答案,大概长这样:
inline void Sum(int u) {
for (int i = hd[u];~i;i = e[i].nxt) {
if (e[i].to != fa[u][0]) {
Sum(e[i].to);
sgt._root[u] = sgt.Merge(sgt._root[u], sgt._root[e[i].to], 1, 100000);
}
}
ans[u] = sgt.qmax(sgt._root[u], 1, 100000);
}
inline void Solve() {
while (m--) {
int u = qread(), v = qread(), t = qread();
int l = Lca(u, v);
sgt.Modify(sgt._root[u], 1, 100000, t, 1);
sgt.Modify(sgt._root[v], 1, 100000, t, 1);
sgt.Modify(sgt._root[l], 1, 100000, t, -1);
if (fa[l][0]) sgt.Modify(sgt._root[fa[l][0]], 1, 100000, t, -1);
}
Sum(1);
//sgt.Dfs(sgt._root[6], 1, 100000);
/*
for (int i = 1;i <= n;i++) {
sgt.Dfs(sgt._root[i], 1, 100000);
puts("-----");
}*/
for (int i = 1;i <= n;i++) {
printf("%d\n", ans[i]);
}
}
然后就过了???
为啥啊/fad