前5个点RE,样例已过,马蜂良好
查看原帖
前5个点RE,样例已过,马蜂良好
838570
Double_Sheep楼主2024/3/30 21:56

rt.

#1 的第一个询问就 WA 了,但找不出来哪错了,求调 谢谢!

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n,m,a[N],b[N],tot,head[N],lst,rt[N];
int f[N][25],dep[N],len,cnt;
struct edge {int v,nxt;}e[N << 1];
struct tree {
	int ls,rs,sum;
}t[N * 25];
int id(int x) {
	return lower_bound(b + 1,b + len + 1,a[x]) - b;
}
void add(int u,int v) {
	e[++tot] = edge {v,head[u]};
	head[u] = tot;
}
void build(int &p,int l,int r) {
	p = ++cnt,t[p].sum = 0;
	if(l == r) return;
	int mid = (l + r) >> 1;
	build(t[p].ls,l,mid);
	build(t[p].rs,mid + 1,r);
}
void ins(int &p,int p0,int l,int r,int qp) {
	p = ++cnt,t[p].sum = t[p0].sum + 1;
	if(l == r) return;
	int mid = (l + r) >> 1;
	if(qp <= mid) ins(t[p].ls,t[p0].ls,l,mid,qp);
	else ins(t[p].rs,t[p0].rs,mid + 1,r,qp);
}
void dfs(int u,int fa){
	ins(rt[u],rt[fa],1,len,id(u));
	f[u][0] = 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 = head[u];i;i = e[i].nxt) {
		int v = e[i].v;
		if(v != fa) dfs(v,u);
	}
}
int LCA(int u,int v) {
	if(dep[u] < dep[v]) swap(u,v);
	for(int i = 20;i >= 0;i--)
		if(dep[f[u][i]] >= dep[v]) u = f[u][i];
	if(u == v) return u;
	for(int i = 20;i >= 0;i--)
		if(f[u][i] != f[v][i])
			u = f[u][i],v = f[v][i];
	return f[u][0];
}
int query(int p1,int p2,int p3,int p4,int l,int r,int k) {
	if(l == r) return l;
	int mid = (l + r) >> 1;
	int sum = t[t[p1].ls].sum + t[t[p2].ls].sum - t[t[p3].ls].sum - t[t[p4].ls].sum;
	if(sum >= k) return query(t[p1].ls,t[p2].ls,t[p3].ls,t[p4].ls,l,mid,k);
	else return query(t[p1].rs,t[p2].rs,t[p3].rs,t[p4].rs,mid + 1,r,k - sum);
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++) {
		scanf("%d",&a[i]);
		b[i] = a[i];
	}
	for(int i = 1;i < n;i++) {
		int u,v; scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	sort(b + 1,b + n + 1);
	len = unique(b + 1,b + n + 1) - b - 1;
	build(rt[0],1,len); dfs(1,0);
	for(int i = 1;i <= m;i++) {
		int u,v,k;
		scanf("%d%d%d",&u,&v,&k);
		u ^= lst; int lca = LCA(u,v);
		//printf("%d %d %d : %d\n",u,v,k,lca);
		int now = b[query(rt[u],rt[v],rt[lca],rt[f[lca][0]],1,len,k)];
		printf("%d\n",now); lst = now;
	}
	return 0;
}
2024/3/30 21:56
加载中...