社区讨论
求dalao看看为什么全re?
P2633Count on a tree参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi6xt21q
- 此快照首次捕获于
- 2025/11/20 12:34 4 个月前
- 此快照最后确认于
- 2025/11/20 12:34 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const int N=200010;
int n,m,a[N*20],b[N*20],h,rt[N*20],cnt;
int s[N*40][2],o[N*20],dep[N*20],anc[N][25];
struct Tree {int ln,rn,sum;} t[N*25];
void add(int x,int y)
{
s[++o[0]][0]=y,s[o[0]][1]=o[x],o[x]=o[0];
}
void dfs(int x,int fa,int deep)
{
dep[x]=deep,anc[x][0]=fa;
for (int i=o[x];i;i=s[i][1]) {
int y=s[i][0];
if (!dep[y]) dfs(y,x,deep+1);
}
}
void zuxian()
{
for (int i=1;i<25;++i)
for (int j=1;j<=n;++j)
anc[i][j]=anc[anc[i][j-1]][j-1];
}
void update(int &x,int last,int l,int r,int p)
{
x=++cnt,t[x]=t[last],++t[x].sum;
if (l==r) return;
int mid=(l+r)>>1;
if (p<=mid) update(t[x].ln,t[last].ln,l,mid,p);
else update(t[x].rn,t[last].rn,mid+1,r,p);
}
void build(int x)
{
update(rt[x],rt[anc[x][0]],1,h,b[x]);
for (int i=o[x];i;i=s[i][1]) {
int y=s[i][0];
if (y!=anc[x][0]) build(y);
}
}
int lca(int x,int y)
{
if (dep[x]>dep[y]) swap(x,y);
if (dep[x]!=dep[y])
for (int j=24;j>=0;--j)
if (dep[y]-(1<<j)>=dep[x])
y=anc[y][j];
if (x!=y) {
for (int j=24;j>=0;--j)
if (anc[x][j]!=anc[y][j])
x=anc[x][j],y=anc[y][j];
x=anc[x][0];
}
return x;
}
#define lx t[x].ln
#define ly t[y].ln
#define lf t[f].ln
#define lg t[g].ln
#define rx t[x].rn
#define ry t[y].rn
#define rf t[f].rn
#define rg t[g].rn
int query(int x,int y,int f,int g,int l,int r,int k)
{
if (l==r) return a[l];
int mid=(l+r)>>1;
int d=t[t[x].ln].sum+t[t[y].ln].sum;
d-=(t[t[f].ln].sum+t[t[g].ln].sum);
if (d>=k) return query(lx,ly,lf,lg,l,mid,k);
else return query(rx,ry,rf,rg,mid+1,r,k-d);
}
int main()
{
cin>>n>>m;int x,y,f,g,k,ans=0;
for (int i=1;i<=n;++i)
scanf("%d",&a[i]),b[i]=a[i];
sort(a+1,a+1+n);
h=unique(a+1,a+1+n)-a-1;
for (int i=1;i<=n;++i)
b[i]=lower_bound(a+1,a+1+h,b[i])-a;
for (int i=1;i<n;++i) {
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
dfs(1,0,1),zuxian(),build(1);
while (m--) {
scanf("%d%d%d",&x,&y,&k);
x^=ans,f=lca(x,y),g=anc[f][0];
ans=query(rt[x],rt[y],rt[f],rt[g],1,h,k);
printf("%d\n",ans);
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...