社区讨论

8pts是暴力的极限还是我写的有问题

P11364[NOIP2024] 树上查询参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi9kmah8
此快照首次捕获于
2025/11/22 08:48
4 个月前
此快照最后确认于
2025/11/22 10:46
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int N = 5e5+10, LOG = 20;
vector<int> g[N];
vector<int> vempty[N];
int dep[N];
int up[LOG][N];
void clear(){
	for(int i = 0; i < N; i++){
		g[i] = vempty[i];
	}
}
void dfs(int u, int fa){
	//cout << "!" << '\n';
	up[0][u] = fa;
	for(int k = 1; k < LOG; k++)
		up[k][u] = up[k - 1][up[k - 1][u]];
	for(auto v : g[u]){
		if(v == fa) continue;
		dep[v] = dep[u] + 1;
		dfs(v, u);
	}
}

int lca(int u, int v){
	if(dep[u] < dep[v]) swap(u, v);
	int diff = dep[u] - dep[v];
	for(int k = 0; k < LOG; k++){
		if(diff & (1<<k)){
			u = up[k][u];
		}
	}
	if(u == v) return u;
	for(int k = LOG - 1; k >= 0; k--){
		if(up[k][u] != up[k][v]){
			u = up[k][u];
			v = up[k][v];
		}
	}
	return up[0][u];
}

int solve(int l, int r, int k){
	int ans = 0;
	for(int i = l; i <= r-k+1; i++){
		int nans = i;
		for(int j = i; j <= i + k - 1; j++){
			//cout << j << " ";
			nans = lca(nans, j);
		}
		//cout << '\n';
		ans = max(dep[nans], ans);
	}
	return ans;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin >> n;
	for(int i = 1, u, v; i < n; i++){
		cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dep[1] = 1;
	dfs(1, 0);
	int q;
	cin >> q;
	for(int i = 1, l, r, k; i <= q; i++){
		cin >> l >> r >> k;
		int mans = 0;
		cout << solve(l,r,k) << '\n';
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...