社区讨论
五彩斑斓,爆零,样例输出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 条回复,欢迎继续交流。
正在加载回复...