社区讨论

五彩斑斓,爆零,样例输出0,玄关求条

P2633Count on a tree参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mknheytg
此快照首次捕获于
2026/01/21 11:47
4 周前
此快照最后确认于
2026/01/21 20:52
4 周前
查看原帖
https://www.luogu.com.cn/record/258391822
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5,INF=2147483647;
int root[N],a[N],fa[N],d[N],f[N][25];
int n,m;
vector<int> To[N];
namespace T{
	struct SegTree{
		int val;
		int ls,rs;
		int l,r;
	}tr[N<<5];
	int tot;
	void push_up(int x){
		tr[x].val=0;
		if(tr[x].ls) tr[x].val+=tr[tr[x].ls].val;
		if(tr[x].rs) tr[x].val+=tr[tr[x].rs].val;
	}
	int build(int l,int r){
		int x=++tot;
		tr[x].l=l,tr[x].r=r;
		tr[x].val=0,tr[x].ls=0,tr[x].rs=0;
		return x;
	}
	int modify(int x,int p,int w){
		int y=build(tr[x].l,tr[x].r);
		int mid=(tr[x].l+tr[x].r)>>1ll;
		tr[y]=tr[x];
		if(tr[y].l==tr[y].r){
			tr[y].val+=w;
			return y;
		}
		if(tr[x].ls==0) tr[y].ls=build(tr[x].l,mid);
		if(tr[x].rs==0) tr[y].rs=build(mid+1,tr[x].r);
		if(p<=mid) tr[y].ls=modify(tr[y].ls,p,w);
		else tr[y].rs=modify(tr[y].rs,p,w);
		push_up(y);
		return y;
	}
	int found(int x,int y,int u,int v,int k){
		if(tr[x].l==tr[x].r) return tr[x].l;
		int res=tr[tr[x].ls].val+tr[tr[y].ls].val-tr[tr[u].ls].val-tr[tr[v].ls].val;
		if(res>=k) return found(tr[x].ls,tr[y].ls,tr[u].ls,tr[v].ls,k);
		else return found(tr[x].rs,tr[y].rs,tr[u].rs,tr[v].rs,k-res);
	}
}
void dfs(int u,int F){
	f[u][0]=fa[u]=F;
	root[u]=T::modify(root[F],a[u],1);
	for(int v:To[u]){
		if(v==F) continue;
		d[v]=d[u]+1;
		dfs(v,u);
	}
}
void LCA_init(){
	for(int j=1;j<25;j++)
		for(int i=1;i<=n;i++)
			f[i][j]=f[f[i][j-1]][j-1];
}
int lca(int u,int v){
	if(d[u]>d[v]) swap(u,v);
	for(int i=24;i>=0;i--){
		if(d[u]>=d[v]) break;
		if(d[u]<=d[v]-(1<<i)) v=f[v][i];
	}
	if(u==v) return u;
	for(int i=24;i>=0;i--)
		if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
	return f[u][0];
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		To[u].push_back(v);
		To[v].push_back(u);
	}
	root[0]=T::build(1,INF);
	dfs(1,0);
	LCA_init();
	int lst=0;
	for(int i=1;i<=m;i++){
		int u,v,k;
		cin>>u>>v>>k;
		u^=lst;
		lst=T::found(root[u],root[v],root[lca(u,v)],root[fa[lca(u,v)]],k);
		cout<<lst<<'\n';
	}
	return 0;
}
看到好多警示后人都是lca有问题。
可是我调了,发现lca没问题。
那是什么有问题呢?
感谢dalao们帮助我。

回复

3 条回复,欢迎继续交流。

正在加载回复...