求救 样例过了但是0分
  • 板块P4116 Qtree3
  • 楼主lao_wang
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/2/28 14:52
  • 上次更新2024/2/28 18:36:53
查看原帖
求救 样例过了但是0分
701408
lao_wang楼主2024/2/28 14:52

树剖+线段树 大佬帮忙看看求求了qwq

#include<bits/stdc++.h>
#define int long long
using namespace std ;
const int N=123456 ;
int n , q , dfs[N] , fa[N] , top[N] , dep[N] , sz[N] , son[N] , tot=0 , be[N] ;
vector<int> e[N] ;
struct node{
	int minn , l , r ;
}tree[N*4];
void dfs1(int u,int f){
	fa[u] = f ;
	dep[u] = dep[f]+1 ;
	sz[u] = 1 ;
	for(auto x:e[u]){
		if(x==f) continue ;
		dfs1(x,u) ;
		sz[u] += sz[x] ;
		if(!son[u]||sz[son[u]]<sz[x]) son[u] = x ;
	}
}
void dfs2(int u,int head){
	dfs[u] = ++tot ;
	be[tot] = u ;
	top[u] = head ;
	if(son[u]) dfs2(son[u],head) ;
	for(auto x:e[u]){
		if(x==fa[u]||x==son[u]) continue ;
		dfs2(x,x) ;
	}
}
void push_up(int num){
	if(tree[num<<1].minn!=-1){
		if(tree[num<<1|1].minn!=-1)
			tree[num].minn = min(tree[num<<1].minn,tree[num<<1|1].minn) ;
		else
			tree[num].minn = tree[num<<1].minn ;
	}else{
		if(tree[num<<1|1].minn!=-1)
			tree[num].minn = tree[num<<1|1].minn ;
		else
			tree[num].minn = -1 ;
	}
}
void made(int num,int l,int r){
	tree[num].l = l ;
	tree[num].r = r ;
	if(l==r){
		tree[num].minn = -1 ;
		return ;
	}
	int mid=(l+r)>>1 ;
	made(num<<1,l,mid) ;
	made(num<<1|1,mid+1,r) ;
	push_up(num) ;
}
void change(int num,int x){
	if(tree[num].l==x&&x==tree[num].r){
		if(tree[num].minn==-1) tree[num].minn = be[tree[num].l] ;
		else tree[num].minn = -1 ;
		return ;
	}
	int mid=(tree[num].l+tree[num].r)>>1 ;
	if(mid>=x) change(num<<1,x) ;
	else change(num<<1|1,x) ;
	push_up(num) ;
}
int ask(int num,int l,int r){
	if(tree[num].l>=l&&tree[num].r<=r)
		return tree[num].minn ;
	int mid=(tree[num].l+tree[num].r)>>1 , minn=-1 ;
	if(mid>=l){
		int temp=ask(num<<1,l,r) ;
		if(temp!=-1) minn = (minn==-1?temp:min(minn,temp)) ;
	}
	if(mid<r){
		int temp=ask(num<<1|1,l,r) ;
		if(temp!=-1) minn = (minn==-1?temp:min(minn,temp)) ;
	}
	return minn ;
}
int LCA(int x,int y){
	int ans=-1 , temp=0 ;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y) ;
		temp = ask(1,dfs[top[x]],dfs[x]) ;
		if(temp!=-1) ans = (ans==-1?temp:min(ans,temp)) ;
		x = fa[top[x]] ;
	}
	if(dep[x]>dep[y]) swap(x,y) ;
	temp = ask(1,dfs[x],dfs[y]) ;
	if(temp!=-1) ans = (ans==-1?temp:min(ans,temp)) ;
	return ans ;
}
signed main(){
	cin >> n >> q ;
	for(int i=1;i<n;i++){
		int u , v ;
		scanf("%lld%lld",&u,&v) ;
		e[u].push_back(v) ;
		e[v].push_back(u) ;
	}
	dfs1(1,0) ;
	dfs2(1,1) ;
	made(1,1,n) ;
	for(int i=1;i<=q;i++){
		int opt , u ;
		scanf("%lld%lld",&opt,&u) ;
		if(opt)
			printf("%lld\n",LCA(1,u)) ;
		else
			change(1,dfs[u]) ;
	}
	return 0 ;
}
2024/2/28 14:52
加载中...