奇怪的 TLE 84 求助
查看原帖
奇怪的 TLE 84 求助
118196
zimujun楼主2021/9/16 17:44

RT

TLE on 8 9 10 11

花了两份提交记录(1 2)交 exit(1) 夹了一下发现好像是树剖 la 假了

都是根据理解瞎实现的可能并不是很优美qq_emoji: kk

#include <bits/stdc++.h>

const int Maxn = 1e6 + 5;

int n, m, x, y, dep[Maxn], siz[Maxn], h[Maxn], top[Maxn], fa[Maxn], cnt[Maxn], dfn[Maxn], dcnt, dir[Maxn], ver[Maxn << 1], nxt[Maxn << 1], hd[Maxn], ecnt;
void add(int u, int v) {ecnt++; ver[ecnt] = v; nxt[ecnt] = hd[u]; hd[u] = ecnt;}
void dfs(int u, int f) {
	dep[u] = dep[fa[u] = f] + (siz[u] = 1);
	for(int i = hd[u]; i; i = nxt[i]) {
		int v = ver[i]; if(v == f) continue;
		dfs(v, u); siz[u] += siz[v];
		if(siz[v] > siz[h[u]]) h[u] = v;
	}
}
void dfs1(int u) {
	if(!top[u]) top[u] = u; if(h[u]) top[h[u]] = top[u];
	dir[dfn[u] = ++dcnt] = u;
	if(h[u]) dfs1(h[u]);
	for(int i = hd[u]; i; i = nxt[i]) {
		int v = ver[i]; if(v == fa[u] || v == h[u]) continue;
		dfs1(v);
	}
}
int la(int u, int k) {
	while(dep[u] - dep[top[u]] < k && u != 1) {
		k -= dep[u] - dep[top[u]] + 1;
		u = fa[top[u]];
	}
	return dir[dfn[u] - k];
}

std::vector<std::pair<int, int> > qs[Maxn]; int ans[Maxn]; 

void dfs2(int u) {
	cnt[dep[u]]--; for(int i = hd[u]; i; i = nxt[i]) if(ver[i] != fa[u]) dfs2(ver[i]);
}
void dfs3(int u) {
	cnt[dep[u]]++; for(int i = hd[u]; i; i = nxt[i]) if(ver[i] != fa[u]) dfs3(ver[i]);
} 
void dfs4(int u) {
	for(int i = hd[u]; i; i = nxt[i]) {
		if(ver[i] == fa[u] || ver[i] == h[u]) continue;
		dfs4(ver[i]); dfs2(ver[i]);
	}
	if(h[u]) dfs4(h[u]);
	for(int i = hd[u]; i; i = nxt[i]) {
		if(ver[i] == fa[u] || ver[i] == h[u]) continue;
		dfs3(ver[i]);
	}
	++cnt[dep[u]];
	for(auto p : qs[u]) {
		int qid = p.first, qk = p.second;
		//printf("find node %d's %d-th son\n", u, qk);
		ans[qid] = cnt[dep[u] + qk] - 1;
	}
}

int main() {
	auto read = [](int & res) {
		int fh = 1; res = 0; char ch = getchar();
		for(; !isdigit(ch); ch = getchar()) if(ch == '-') fh = -1;
		for(; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ '0');
		res = res * fh; 
	};
	read(n); read(m);
	for(int i = 2; i <= n; ++i) {
		read(x); add(x, i), add(i, x);
	}
	dfs(1, 0), dfs1(1);
	exit(1);
	for(int i = 1; i <= m; ++i) read(x), read(y), qs[la(x, y)].push_back(std::make_pair(i, y));
	dfs4(1);
	for(int i = 1; i <= m; ++i) printf("%d ", ans[i]); 
	return 0; 
}
2021/9/16 17:44
加载中...