圆方树求调 35pts
查看原帖
圆方树求调 35pts
750163
_Kenma_楼主2024/4/8 17:53
#include<bits/stdc++.h>
using namespace std;
long long n,m,q;
long long dfs[1000005],low[1000005],d_cnt,ccnt;
vector<long long> v[1000005],u[1000005];
stack<long long> s;
void tarjan(long long x){
	dfs[x]=low[x]=++d_cnt;
	s.push(x);
	for(long long i=0;i<v[x].size();i++){
		long long y=v[x][i];
		if(!dfs[y]){
			tarjan(y); 
			low[x]=min(low[x],low[y]);
			if(low[y]==dfs[x]){
				ccnt++;
				while(s.top()!=x){
					long long y=s.top();
					s.pop();
					u[ccnt].push_back(y);
					u[y].push_back(ccnt);
				}
				u[ccnt].push_back(x);
				u[x].push_back(ccnt);
			}
		}else low[x]=min(low[x],dfs[y]);	
	}
}
long long size[1000005],dep[1000005],h[1000005],top[1000005],f[1000005],hson[1000005],rnk[1000005],dfn[1000005],cnt;
void dfs1(long long x,long long fa){
	size[x]=1;
	for(long long i=0;i<u[x].size();i++){
		long long y=u[x][i];
		if(y==fa) continue;
		dep[y]=dep[x]+1;
		f[y]=x;
		dfs1(y,x);
		size[x]+=size[y];
		if(size[y]>size[hson[x]]) hson[x]=y;
	}
}
void dfs2(long long x,long long t){
	top[x]=t;
	cnt++;
	dfn[x]=cnt;
	rnk[cnt]=x;
	if(!hson[x]) return;
	dfs2(hson[x],t);
	for(long long i=0;i<u[x].size();i++){
		long long y=u[x][i];
		if(y==f[x] || y==hson[x]) continue;
		dfs2(y,y);
	}
}
long long val[2000005],ls[2000005],rs[2000005],dcnt;
void pushup(long long x){
	val[x]=val[ls[x]]+val[rs[x]];
}
void build(long long l,long long r,long long &x){
	x=++dcnt;
	if(l==r){
		val[x]=h[rnk[l]];
		return;
	}
	long long mid=(l+r)>>1;
	build(l,mid,ls[x]);
	build(mid+1,r,rs[x]);
	pushup(x);
}
long long query(long long l,long long r,long long ql,long long qr,long long x){
	if(ql<=l && r<=qr) return val[x];
	long long mid=(l+r)>>1,ans=0;
	if(ql<=mid) ans+=query(l,mid,ql,qr,ls[x]);
	if(qr>=mid+1) ans+=query(mid+1,r,ql,qr,rs[x]);
	return ans; 
}
long long query_line(long long x,long long y){
	long long ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			ans+=query(1,ccnt,dfn[top[x]],dfn[x],1);
			x=f[top[x]];
		}else{
			ans+=query(1,ccnt,dfn[top[y]],dfn[y],1);
			y=f[top[y]]; 
		}
	}
	if(dep[x]<dep[y]) ans+=query(1,ccnt,dfn[x],dfn[y],1);
	else ans+=query(1,ccnt,dfn[y],dfn[x],1);
	return ans;
}
long long x,y;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	ccnt=n;
	for(long long i=1;i<=m;i++){
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	} 
	for(int i=1;i<=n;i++) h[i]=1;
	tarjan(1);
	dfs1(1,0);
	dfs2(1,0);
	//cout<<ccnt<<endl; 
	build(1,ccnt,x);
	cin>>q;
	for(long long i=1;i<=q;i++){
		cin>>x>>y;
		cout<<query_line(x,y)<<'\n'; 
	} 
	return 0;
}
2024/4/8 17:53
加载中...