为啥不能dfs完算答案啊
查看原帖
为啥不能dfs完算答案啊
91127
_5011_楼主2020/11/11 22:04

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

2020/11/11 22:04
加载中...