蒟蒻求助,线段树的合并只有28pts(TLE+WA)
查看原帖
蒟蒻求助,线段树的合并只有28pts(TLE+WA)
461359
huangrenheluogu楼主2023/8/15 07:54
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct tree{
	int ls, rs, sum;
}t[N * 55];
struct data{
	int x, d, ans, id;
}ANS[N];
vector<data>a[N];
int n, Q, son[N << 1], nxt[N << 1], fir[N], tot, x, dep[N], rt[N], cnt, k, fa[N][21], kk, dd;
inline void add(int x, int y){
	nxt[++tot] = fir[x];
	fir[x] = tot;
	son[tot] = y;
}
inline void update(int &p, int l, int r, int x, int val){
	if(p == 0) p = ++cnt;
	if(l == r){
		t[p].sum += val;
		return ;
	}
	int mid = l + r >> 1;
	if(mid >= x) update(t[p].ls, l, mid, x, val);
	else update(t[p].rs, mid + 1, r, x, val);
	t[p].sum = t[t[p].ls].sum + t[t[p].rs].sum;
}
inline void merge(int &p, int q){
	if(!p || !q){
		p = p + q;
		return ;
	}
	t[p].sum += t[q].sum;
	if(t[t[p].ls].sum + t[t[q].rs].sum) merge(t[p].ls, t[q].ls);
	if(t[t[p].rs].sum + t[t[q].rs].sum) merge(t[p].rs, t[q].rs);
}
inline void dfs(int x, int ff){
	dep[x] = dep[ff] + 1;
	fa[x][0] = ff;
	for(int i = 1; i <= 20; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
	update(rt[x], 1, n, dep[x], 1);
	for(int i = fir[x]; i ; i = nxt[i]){
		dfs(son[i], x);
	}
}
inline int query(int p, int l, int r, int x){
	if(l == r) return t[p].sum;
	int mid = l + r >> 1;
	if(mid >= x) return query(t[p].ls, l, mid, x);
	else return query(t[p].rs, mid + 1, r, x);
}
inline void dfs2(int x, int ff){
	for(int i = fir[x]; i ; i = nxt[i]){
		dfs2(son[i], x);
		merge(rt[x], rt[son[i]]);
	}
	for(auto i : a[x]){
		i.ans = query(rt[x], 1, n, i.d) - 1;
		ANS[++cnt] = i;
	}
}
inline bool cmp(data x, data y){
	return x.id < y.id;
}
int main(){
	scanf("%d%d", &n, &Q);
	for(int i = 2; i <= n; i++){
		scanf("%d", &x);
		add(x, i);
	}
	dfs(1, 0);
	for(int i = 1; i <= Q; i++){
		scanf("%d%d", &x, &k);
		dd = dep[x];
		kk = k;
		for(int i = 20; ~i; i--){
			if(kk >= (1 << i)){
				kk -= (1 << i);
				x = fa[x][i];
			}
		}
		a[x].push_back((data){x, dd, 0, i});
	}
	cnt = 0;
	dfs2(1, 0);
	sort(ANS + 1, ANS + cnt + 1, cmp);
	for(int i = 1; i <= Q; i++) printf("%d ", ANS[i].ans);
	return 0;
}

感谢各位大佬。

2023/8/15 07:54
加载中...