社区讨论
时间复杂度求问
P11364[NOIP2024] 树上查询参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @midzwnz2
- 此快照首次捕获于
- 2025/11/25 11:07 3 个月前
- 此快照最后确认于
- 2025/11/25 13:23 3 个月前
我这个暴力自己算着应该是的,但是只过了1,2,14,15四个点,求大佬指导
CPP#include<bits/stdc++.h>
#define mid (l+r>>1)
using namespace std;
const int maxn=5e5+3;
int inline read(){
int res=0;
char c;c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){
res=res*10+c-'0';
c=getchar();
}
return res;
}
int n,q;
int first[maxn],nxt[maxn<<1],to[maxn<<1],tot;
void add(int x,int y){
nxt[++tot]=first[x];first[x]=tot;to[tot]=y;
}
int dep[maxn],f[maxn][21];
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=1;i<=20;i++){
f[u][i]=f[f[u][i-1]][i-1];
}
for(int i=first[u];i;i=nxt[i]){
int v=to[i];
if(v==fa)continue;
f[v][0]=u;
dfs(v,u);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--){
if(dep[f[x][i]]>=dep[y]){
x=f[x][i];
}
}
if(x==y)return x;
for(int i=20;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];y=f[y][i];
}
}
return f[x][0];
}
int t[maxn<<2];
void pushup(int u){
t[u]=lca(t[u<<1],t[u<<1|1]);
}
void build(int u,int l,int r){
if(l==r){
t[u]=l;
return;
}
build(u<<1,l,mid);build(u<<1|1,mid+1,r);
pushup(u);
}
int find(int u,int l,int r,int x,int y){
if(l>=x&&r<=y){
return t[u];
}
int res=0;
if(x<=mid)res=find(u<<1,l,mid,x,y);
if(y>mid){
if(res)res=lca(res,find(u<<1|1,mid+1,r,x,y));
else res=find(u<<1|1,mid+1,r,x,y);
}
return res;
}
int main(){
n=read();
for(int i=1;i<n;i++){
int u,v;
u=read();v=read();
add(u,v);add(v,u);
}
dfs(1,0);
build(1,1,n);
cin>>q;
for(int i=1;i<=q;i++){
int l,r,k;
l=read();r=read();k=read();
int ans=0;
for(int j=l;j+k-1<=r;j++){
ans=max(ans,dep[find(1,1,n,j,j+k-1)]);
}
cout<<ans<<endl;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...