社区讨论
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 条回复,欢迎继续交流。
正在加载回复...