树链剖分6pts求调
查看原帖
树链剖分6pts求调
284916
2019yyy楼主2024/7/25 16:32
#include<bits/stdc++.h>
using namespace std;
#define ls(x) (1<<x)
#define rs(x) ((1<<x)|1)
#define rt(x) (x>>1)
#define int long long
int n,k;
struct SegmentTree{
	int f[1100000],tag[1100000];
	void updata(int x,int l,int r,int val){
		tag[x]=tag[x]+val;
		f[x]=f[x]+val;
	}
	void pushUp(int x){
		f[x]=max(f[ls(x)],f[rs(x)]);
	}
	void pushDown(int x,int l,int r){
		int mid=((l+r)>>1);
		updata(ls(x),l,mid,tag[x]);
		updata(rs(x),mid+1,r,tag[x]);
		tag[x]=0;
	}
	void modify(int x,int l,int r,int tl,int tr,int val){
		if(l>=tl&&r<=tr){
			updata(x,l,r,val);
			return ;
		}
		pushDown(x,l,r);
		int mid=(l+r)>>1;
		if(tl<=mid){
			modify(ls(x),l,mid,tl,tr,val);
		}
		if(tr>=mid+1){
			modify(rs(x),mid+1,r,tl,tr,val);
		}
		pushUp(x);
	}
	int query(int x,int l,int r,int tl,int tr){
		int ans=0;
		if(l>=tl&&r<=tr){
			return ans=f[x];
		}
		pushDown(x,l,r);
		int mid=(l+r)>>1;
		if(tl<=mid){
			ans=max(ans,query(ls(x),l,mid,tl,tr));
		}
		if(tr>=mid+1){
			ans=max(ans,query(rs(x),mid+1,r,tl,tr));
		}
		return ans;
	}
} ST;

struct Edge{
	int next,to;
} a[11000000];
int head[1100000],cnt;
void addEdge(int x,int y){
	a[++cnt].next=head[x];
	head[x]=cnt;
	a[cnt].to=y;
}

int fa[1100000],size[1100000],son[1100000],id[1100000],deep[1100000],top[1100000];
void dfs1(int x,int fax){
	int maxx=0;
	deep[x]=deep[fax]+1;
	fa[x]=fax;
	size[x]=1;
	for(int i=head[x];i;i=a[i].next){
		if(a[i].to==fax){
			continue;
		}
		dfs1(a[i].to,x);
		size[x]=size[x]+size[a[i].to];
		if(maxx<size[a[i].to]){
			maxx=size[a[i].to];
			son[x]=a[i].to;
		}
	}
}

int idcnt=0;
void dfs2(int x,int fax){
	id[x]=++idcnt;
	top[son[x]]=top[x];
	if(!son[x]){
		return ;
	}
	dfs2(son[x],x);
	for(int i=head[x];i;i=a[i].next){
		if(a[i].to==fax||a[i].to==son[x]){
			continue;
		}
		dfs2(a[i].to,x);
	}
}

void IntervalModify(int l,int r,int val){
	if(deep[top[l]]<deep[top[r]]){
		swap(l,r);
	}
	if(fa[top[l]]==fa[top[r]]){
		if(id[l]>id[r]){
			swap(l,r);
		}
		ST.modify(1,1,n,id[l],id[r],val);
		return ;
	}
	ST.modify(1,1,n,id[top[l]],id[l],val);
	IntervalModify(fa[top[l]],r,val);
}

int IntervalQuery(int l,int r){
	return ST.query(1,1,n,l,r);
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n-1;i++){
		int x,y;
		cin>>x>>y;
		addEdge(x,y);
		addEdge(y,x);
		top[i]=i;
	}
	top[n]=n;
	dfs1(1,0);
	dfs2(1,1);
	
	
	while(k--){
		int x,y;
		cin>>x>>y;
		IntervalModify(x,y,1);
	}
	cout<<IntervalQuery(1,n)<<'\n';
	return 0;
}

提交记录

2024/7/25 16:32
加载中...