社区讨论
全部RE,懵逼,求dalao解疑
P2633Count on a tree参与者 13已保存回复 14
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 14 条
- 当前快照
- 1 份
- 快照标识符
- @mi6hom9u
- 此快照首次捕获于
- 2025/11/20 05:03 4 个月前
- 此快照最后确认于
- 2025/11/20 05:09 4 个月前
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
const int Logn=20;
const int N=101000;
const int INF=0x3f3f3f3f;
const int M=2100000;
struct Array{
int x,idx;
bool operator < (const Array &rhs) const{
return x<rhs.x;
}
}a[N];
struct TreeNode{
int L,R,sum;
}T[M];
struct Edge{
int to,next;
}e[N*2];
int head[N],root[N],fa[N][Logn],rank[N],dep[N];
int n,m,EdgeCnt=0,T_cnt=1;
int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
void addedge(int u,int v){
int p=++EdgeCnt;
e[p].to=v;e[p].next=head[u];
head[u]=p;
}
void insert(int &now,int val,int l=1,int r=n){
T[T_cnt++]=T[now];now=T_cnt-1;
T[now].sum++;
if (l==r)return;
int mid=(l+r)>>1;
if (val<=mid)insert(T[now].L,val,l,mid);
else insert(T[now].R,val,mid+1,r);
}
int query(int a,int b,int c,int d,int k,int l=1,int r=n){
if (l==r)return l;
int t=T[T[a].L].sum+T[T[b].L].sum-T[T[c].L].sum-T[T[d].L].sum;
int mid=(l+r)>>1;
if (k<=t)return query(T[a].L,T[b].L,T[c].L,T[d].L,k,l,mid);
else return query(T[a].R,T[b].R,T[c].R,T[d].R,k-t,mid+1,r);
}
void dfs(int u){
root[u]=root[fa[u][0]];
insert(root[u],rank[u]);
for (int p=head[u];p;p=e[p].next){
int v=e[p].to;
if (v!=fa[u][0]){
fa[v][0]=u;
dep[v]=dep[u]+1;
dfs(v);
}
}
}
int LCA(int u,int v){
if (dep[u]<dep[v])swap(u,v);
for (int k=Logn-1;k>=0;k--)
if (dep[fa[u][k]]>=dep[v])u=fa[u][k];
if (u==v)return u;
for (int k=Logn-1;k>=0;k--)
if (fa[u][k]!=fa[v][k]){u=fa[u][k],v=fa[v][k];}
return fa[u][0];
}
int main(){
n=read(),m=read();
for (int i=1;i<=n;i++){
a[i].x=read(),a[i].idx=i;
}
sort(a+1,a+n+1);
for (int i=1;i<=n;i++)rank[a[i].idx]=i;
for (int i=1;i<n;i++){
int u=read(),v=read();
addedge(u,v);addedge(v,u);
}
T_cnt=0;fa[1][0]=0;root[0]=0;dep[1]=1;dfs(1);
for (int i=1;i<Logn;i++)
for (int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];
int ans=0;
for (int i=1;i<=m;i++){
int u=read(),v=read(),k=read();
u^=ans;
int tt=LCA(u,v);
int tmp=query(root[u],root[v],root[tt],root[fa[tt][0]],k);
ans=a[tmp].x;
printf("%d\n",ans);
}
return 0;
}
回复
共 14 条回复,欢迎继续交流。
正在加载回复...