社区讨论

求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 条回复,欢迎继续交流。

正在加载回复...