社区讨论
WA求调教,95分#2
P4556【模板】线段树合并 / [Vani 有约会] 雨天的尾巴参与者 5已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mjmtbumy
- 此快照首次捕获于
- 2025/12/26 19:53 2 个月前
- 此快照最后确认于
- 2025/12/28 13:05 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
struct p{
long long l, r, cnt;
}tree[8000005];
long long n, m, u, v, w, cnt, dep[100005], dp[100005][25], root[100005], ans[100005];
vector<long long> a[100005];
void dfs1(long long x, long long father){
for(auto i:a[x]){
if(i==father) continue;
dep[i]=dep[x]+1;
dp[i][0]=x;
for(long long j=1;j<=log2(dep[i]);j++) dp[i][j]=dp[dp[i][j-1]][j-1];
dfs1(i, x);
}
}
long long check(long long x, long long k){
long long now=x;
for(long long i=floor(log2(k));i>=0;i--){
if(dep[dp[now][i]]<dep[x]-k) continue;
now=dp[now][i];
}
return now;
}
long long find(long long x, long long y){
if(dep[x]<dep[y]) swap(x, y);
x=check(x, dep[x]-dep[y]);
if(x==y) return x;
for(long long i=floor(log2(n));i>=0;i--){
if(dp[x][i]==dp[y][i]) continue;
x=dp[x][i];
y=dp[y][i];
}
return dp[x][0];
}
void push_up(long long x){
tree[x].cnt=max(tree[tree[x].l].cnt, tree[tree[x].r].cnt);
}
void build(long long pos, long long k, long long l, long long r, long long &x){
if(!x) x=++cnt;
if(l==r){
tree[x].cnt+=k;
return ;
}
long long mid=(l+r)>>1;
if(pos<=mid) build(pos, k, l, mid, tree[x].l);
else build(pos, k, mid+1, r, tree[x].r);
push_up(x);
}
long long update(long long u, long long v, long long l, long long r){
if(!u) return v;
if(!v) return u;
if(l==r){
tree[u].cnt+=tree[v].cnt;
return u;
}
long long mid=(l+r)>>1;
tree[u].l=update(tree[u].l, tree[v].l, l, mid);
tree[u].r=update(tree[u].r, tree[v].r, mid+1, r);
push_up(u);
return u;
}
long long query(long long k, long long l, long long r, long long x){
if(!x) return 0;
if(l==r) return l;
long long mid=(l+r)>>1;
if(tree[tree[x].l].cnt==k) return query(k, l, mid, tree[x].l);
else return query(k, mid+1, r, tree[x].r);
}
void dfs(long long x, long long fa){
for(auto i:a[x]){
if(i==fa) continue;
dfs(i, x);
root[x]=update(root[x], root[i], 1, 100000);
}
ans[x]=query(tree[root[x]].cnt, 1, 100000, root[x]);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(long long i=1;i<n;i++){
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
dp[1][0]=0;
dep[1]=1;
dfs1(1, 0);
while(m--){
cin>>u>>v>>w;
long long LCA=find(u, v);
build(w, 1, 1, 100000, root[u]);
build(w, 1, 1, 100000, root[v]);
build(w, -1, 1, 100000, root[LCA]);
build(w, -1, 1, 100000, root[dp[LCA][0]]);
}
dfs(1, 0);
for(long long i=1;i<=n;i++) cout<<ans[i]<<'\n';
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...