给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。
M行,表示每个询问的答案。最后一个询问不输出换行符
#include<map> #include<set> #include<queue> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mid (L+R)/2 using namespace std; int ans; int tot; int cnt; int anc; int n,m,q; int x,y,z; int d[100010]; int v[100010]; int h[100010]; int l[3000010]; int r[3000010]; int to[200010]; int head[100010]; int next[200010]; int sum[3000010]; int root[100010]; int f[100010][20]; map<int,int>b; void add(int x,int y) { tot++; next[tot]=head[x]; head[x]=tot; to[tot]=y; } int lca(int x,int y) { if(d[x]<d[y]) { swap(x,y); } int dep=d[x]-d[y]; for(int i=0;i<=19;i++) { if((dep&(1<<i))!=0) { x=f[x][i]; } } if(x==y) { return x; } for(int i=19;i>=0;i--) { if(f[x][i]!=f[y][i]) { x=f[x][i]; y=f[y][i]; } } return f[x][0]; } int updata(int pre,int L,int R,int k) { int rt=++cnt; l[rt]=l[pre]; r[rt]=r[pre]; sum[rt]=sum[pre]+1; if(L==R) { return rt; } else { if(k<=mid) { l[rt]=updata(l[pre],L,mid,k); } else { r[rt]=updata(r[pre],mid+1,R,k); } } return rt; } int query(int x,int y,int anc,int fa,int L,int R,int k) { if(L==R) { return b[L]; } int num=sum[l[x]]+sum[l[y]]-sum[l[anc]]-sum[l[fa]]; if(num>=k) { return query(l[x],l[y],l[anc],l[fa],L,mid,k); } else { return query(r[x],r[y],r[anc],r[fa],mid+1,R,k-num); } } void dfs(int x,int fa) { d[x]=d[fa]+1; int k=lower_bound(h+1,h+1+m,v[x])-h; b[k]=v[x]; root[x]=updata(root[fa],1,n,k); for(int i=1;i<=19;i++) { f[x][i]=f[f[x][i-1]][i-1]; } for(int i=head[x];i;i=next[i]) { if(to[i]!=fa) { f[to[i]][0]=x; dfs(to[i],x); } } } int main() { scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) { scanf("%d",&v[i]); h[i]=v[i]; } sort(h+1,h+1+n); m=unique(h+1,h+1+n)-h-1; for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(1,0); for(int i=1;i<=q;i++) { scanf("%d%d%d",&x,&y,&z); x=x^ans; anc=lca(x,y); ans=query(root[x],root[y],root[anc],root[f[anc][0]],1,n,z); printf("%d\n",ans); } }
BZOJ2588Count on a tree——LCA+主席树
原文:https://www.cnblogs.com/Khada-Jhin/p/9298150.html