5 pts 玄关求调
查看原帖
5 pts 玄关求调
1241014
ruik楼主2025/2/5 15:52

有两个点MLE,其他错的点全都是WA。

#include<bits/stdc++.h>
using namespace std;
//#define getchar getchar_unlocked //关闭调试 
inline int read(){
	int x=0,t=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')t=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x*t;
}
const int N=1e5+5;
int n,m,x,y;
struct edge{int x,y;}e[N];
int dfn[N],tot,low[N],co[N],col;
bool bridge[N];
vector<pair<int,int> >p[N],g[N];

inline void tarjan(int u,int fa){
	dfn[u]=low[u]=++tot;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].first;
		if(v==fa)continue;
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u])bridge[g[u][i].second]=true;
		}
		else low[u]=min(low[u],dfn[v]);
	}
}

inline void getco(int x,int col){
	co[x]=col;
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i].first,z=g[x][i].second;
		if(!bridge[z]&&!co[y])getco(y,col);
	}
}
int dep[N],fa[N],num[N],son[N],in[N],out[N],top[N],tot_time,nw[N];
inline void dfs1(int x,int from){
	dep[x]=dep[from]+1;
	fa[x]=from;
	for(int i=0;i<p[x].size();i++){
		if(p[x][i].first!=from){
			int y=p[x][i].first;
			dfs1(y,x);
			num[x]+=num[y];
			if(num[y]>num[son[x]])son[x]=y;
		}
	}num[x]++;
}
inline void dfs2(int x,int tp,int from){
	top[x]=tp;
	in[x]=++tot_time;
	if(!son[x]){out[x]=tot_time;return ;}
	dfs2(son[x],tp,x);
	for(int i=0;i<p[x].size();i++){
		if(p[x][i].first!=from&&p[x][i].first!=son[x]){
			dfs2(p[x][i].first,p[x][i].first,x);
		}nw[p[x][i].second]=in[p[x][i].first];
	}out[x]=tot_time;
}
int w[N*4];
inline int ask(int l,int r,int x,int m){
	if(w[m]||l==r)return w[m];
	else {
		int mid=(l+r)>>1;
		if(x<=mid)return ask(l,mid,x,m*2);
		else return ask(mid+1,r,x,m*2+1);
	}
}
inline void change(int l,int r,int x,int y,int m,int k){
	if(x<=l&&r<=y)w[m]=k;
	else {
		int mid=(l+r)>>1;
		if(x<=mid)change(l,mid,x,y,m*2,k);
		if(y>mid)change(mid+1,r,x,y,m*2+1,k);
	}
}
inline void replace(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
	//		cout<<in[top[x]]<<" "<<in[x]<<" 2"<<endl;
			change(1,col,in[top[x]],in[x],1,2);
			x=fa[top[x]];
		}else {
		//	cout<<in[top[y]]<<" "<<in[y]<<" 1"<<endl;
			change(1,col,in[top[y]],in[y],1,1);
			y=fa[top[y]];
		}
	}
	if(x==y)return ;
	if(dep[x]>dep[y])change(1,col,in[son[y]],in[x],1,2);
	else change(1,col,in[son[x]],in[y],1,1);
//	if(dep[x]>dep[y])cout<<in[son[y]]<<" "<<in[x]<<" 2"<<endl;
//	else cout<<in[son[x]]<<" "<<in[y]<<" 1"<<endl;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		e[i].x=read();e[i].y=read();
		g[e[i].x].push_back(make_pair(e[i].y,i));
		g[e[i].y].push_back(make_pair(e[i].x,i));
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
	for(int i=1;i<=n;i++)if(!co[i])getco(i,++col);
	for(int i=1;i<=m;i++){
		x=co[e[i].x],y=co[e[i].y];
		if(x!=y){
			p[x].push_back(make_pair(y,i));
			p[y].push_back(make_pair(x,i));
		}
	}
	dfs1(1,1);
	dfs2(1,1,1);
	int q=read();
	while(q--){
		x=read();y=read();
		if(co[x]!=co[y])replace(co[x],co[y]);
	}
	for(int i=1;i<=m;i++){
		x=e[i].x,y=e[i].y;
		if(co[x]==co[y])putchar('B');
		else {
			int NOW=ask(1,col,nw[i],1);
			if(!NOW)putchar('B');
			else if((NOW==1&&dep[co[x]]<dep[co[y]])||(NOW==2&&dep[co[x]]>dep[co[y]]))putchar('L');
			else putchar('R');
		}
	}
	return 0;
}
2025/2/5 15:52
加载中...