树剖求调

P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并

```cpp #include<bits/stdc++.h> using namespace std; int n,m,l,ans[1000010]; vector<int>a[1000010]; struct Edge{ int To,Next; }e[1000010]; int head[1000010],tot; int cnt; struct Node{ int top,f,seg,sum,d; int hs; }inf[1000010]; struct Linetree{ int sum,ans; }lt[10000010]; /* ----------------treechain--------------- */ void add(int x,int y){ e[++tot].Next=head[x]; e[tot].To=y; head[x]=tot; return; } void dfs1(int t,int f,int dep){ inf[t].f=f;inf[t].sum=1;inf[t].d=dep; int now=0; for(int i=head[t];i;i=e[i].Next){ if(e[i].To!=f){ dfs1(e[i].To,t,dep+1); inf[t].sum+=inf[e[i].To].sum; if(inf[e[i].To].sum>now){ now=inf[e[i].To].sum; inf[t].hs=e[i].To; } } } return; } void dfs2(int t,int f,int top){ inf[t].seg=++cnt;inf[t].top=top; for(int i=head[t];i;i=e[i].Next) if(e[i].To==inf[t].hs) dfs2(e[i].To,t,top); for(int i=head[t];i;i=e[i].Next) if(e[i].To!=f&&e[i].To!=inf[t].hs) dfs2(e[i].To,t,e[i].To); return; } void LCA(int x,int y,int z){ // cout<<x<<" "<<y<<" "<<z<<endl; int nowx=inf[x].top; int nowy=inf[y].top; if(nowx==nowy){ if(inf[y].seg<inf[x].seg) swap(x,y); a[inf[x].seg-1].push_back(-z); a[inf[y].seg].push_back(z); } else if(inf[nowx].d>inf[nowy].d){ a[inf[nowx].seg-1].push_back(-z); a[inf[x].seg].push_back(z); LCA(inf[nowx].f,y,z); } else if(inf[nowx].d<=inf[nowy].d){ a[inf[nowy-1].seg].push_back(-z); a[inf[y].seg].push_back(z); LCA(x,inf[nowy].f,z); } return; } /* ------------linetree-------------- */ void build(int k,int l,int r){ lt[k].sum=0; if(l==r){ lt[k].ans=l; return; } int mid=l+r>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); return; } void ltadd(int k,int l,int r,int x,int s){ if(l>x||r<x) return; if(l==r&&l==x){ lt[k].sum+=s; return; } int mid=l+r>>1; ltadd(k<<1,l,mid,x,s); ltadd(k<<1|1,mid+1,r,x,s); if(lt[k<<1|1].sum>lt[k<<1].sum){ lt[k].sum=lt[k<<1|1].sum; lt[k].ans=lt[k<<1|1].ans; } else{ lt[k].sum=lt[k<<1].sum; lt[k].ans=lt[k<<1].ans; } // cout<<k<<" "<<l<<" "<<r<<" "<<lt[k].sum<<" "<<lt[k].ans<<endl; return; } int main(){ scanf("%d %d",&n,&m); for(int i=1;i<n;i++){ int u,v; scanf("%d %d",&u,&v); add(u,v); add(v,u); } dfs1(1,0,1); dfs2(1,0,1); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d %d %d",&x,&y,&z); LCA(x,y,z); l=max(l,z); } build(1,0,l); map<int,int>h; for(int i=1;i<=n;i++) h[inf[i].seg]=i; for(int i=n;i>=1;i--){ // cout<<h[i]<<endl; for(auto j:a[i]){ int s=1; if(j<0) s=-1; j=abs(j); // cout<<j<<" "<<s<<endl; ltadd(1,0,l,j,s); } // system("pause"); ans[i]=lt[1].ans; } // system("pause"); for(int i=1;i<=n;i++){ printf("%d\n",ans[inf[i].seg]); } return 0; } ```
by jqsh @ 2023-10-18 15:56:28


|