树剖求调
查看原帖
树剖求调
320652
jqsh楼主2023/10/18 10:17
#include<bits/stdc++.h>
using namespace std;
int n,m,l,ans[1000001];
vector<int>a[1000001];
struct Edge{
	int To,Next;
}e[1000001];
int head[1000001],tot;
int cnt;
struct Node{
	int top,f,seg,sum,d;
	int hs;
}inf[1000001];
struct Linetree{
	int sum,ans;
}lt[10000001];

/*   ----------------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;
		//	cout<<t<<" "<<inf[e[i].To].sum<<" "<<now<<" "<<e[i].To<<endl;
			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){
//	cout<<t<<" "<<inf[t].hs<<endl;
	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].push_back(z);
		a[inf[inf[y].f].seg].push_back(-z);
	}
	else if(inf[nowx].d>inf[nowy].d){
		a[inf[inf[nowx].f].seg].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[inf[nowy].f].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;
	cout<<endl;
	cout<<endl;
	for(int i=1;i<=n;i++){
		for(auto j:a[i]){
			int s=1;
			if(j<0)	s=-1;
			j=abs(j);
			cout<<h[i]<<endl;
			ltadd(1,0,l,j,s);
			cout<<lt[1].ans<<endl;
			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;
}
2023/10/18 10:17
加载中...