求助树剖0pts
查看原帖
求助树剖0pts
370216
Kanbe_Kotori楼主2020/12/24 21:03
#include<bits/stdc++.h>
using namespace std;
#define RI register int
const int MAXN=3e5+1;
int cnt,cont;
int N,M;
vector<int> dian[MAXN];
int dad[MAXN],son[MAXN],siz[MAXN],dep[MAXN];
int d[MAXN];
int top[MAXN],id[MAXN];
int data[MAXN<<2];
int xx[MAXN],yy[MAXN];
inline void Add(int x,int y){
	dian[x].push_back(y);
}
namespace segment_tree{
	inline int ls(int n){
		return n<<1;		
	}
	inline int rs(int n){
		return n<<1|1;	
	}
	inline void push_up(int n){
		data[n]=max(data[ls(n)],data[rs(n)]);	
	}	
	inline void upd(int ud,int l,int r,int k,int now){
		if(l==r){
			data[now]=k;
			return ;
		}
		int mid=(l+r)>>1;
		if(ud<=mid)upd(ud,l,mid,k,ls(now));
		else upd(ud,mid+1,r,k,rs(now));
		push_up(now);
	}
	inline int query(int ql,int qr,int l,int r,int now){
		if(ql<=l&&r<=qr)
			return data[now];
		int mid=(l+r)>>1;
		int ans=0;
		if(ql<=mid)ans=max(ans,query(ql,qr,l,mid,ls(now)));
		if(qr>mid)ans=max(ans,query(ql,qr,mid+1,r,rs(now)));
		return ans;
	}
}using namespace segment_tree;
namespace pou_tree{
	inline void dfs1(int now,int fa){
		dep[now]=dep[fa]+1;
		dad[now]=fa;
		siz[now]=1;
		int maxson=-1;
		for(RI i=0;i<dian[now].size();i++){
			int nx=dian[now][i];
			if(nx==fa)continue ;
			dfs1(nx,now);
			siz[now]+=siz[nx];
			if(maxson<siz[nx])maxson=siz[nx],son[now]=nx;
		}
	}	
	inline void dfs2(int now,int topf){
		id[now]=++cnt;
		top[now]=topf;
		if(!son[now])return ;
		dfs2(son[now],topf);
		for(RI i=0;i<dian[now].size();i++){
			int nx=dian[now][i];
			if(nx==son[now]||nx==dad[now])continue ;
			dfs2(nx,nx);	
		}
	}
	inline int query_lj(int x,int y){
		while(top[x]!=top[y]){
			if(dep[top[x]]<dep[top[y]])swap(x,y);
			if(query(id[top[x]],id[x],1,N,1)==1)return 0;
			x=dad[top[x]]; 
		}
        if(x==y)return 1;
		if(query(min(id[x],id[y])+1,max(id[x],id[y]),1,N,1)==1)return 0;
		return 1;
	}
}using namespace pou_tree;
signed main(){
	scanf("%d%d",&N,&M);
	int u,v;
	for(RI i=1;i<N;i++){
		scanf("%d%d",&u,&v);
		Add(u,v);
		Add(v,u);	
	}
	dfs1(1,1);
	dfs2(1,1);
	char opt[1];
	int x,y;
	while(M--){
		scanf("%s",opt);
		if(opt[0]=='Q')	{
			scanf("%d%d",&x,&y);
			if(query_lj(x,y))printf("Yes\n");
			else printf("No\n");
		}
		else if(opt[0]=='C'){
			scanf("%d%d",&xx[++cont],&yy[cont]);
			upd(max(id[xx[cont]],id[yy[cont]]),1,N,1,1);
		}
		else {
			scanf("%d",&x);
			upd(max(id[xx[x]],id[yy[x]]),1,N,0,1);
		}
	}
	return 0;
}

卡了几个小时了。。。

2020/12/24 21:03
加载中...