MLE 90 pts 玄关求调
查看原帖
MLE 90 pts 玄关求调
1241014
ruik楼主2025/2/5 16:55

MLE on #2 、#3

思路:缩点+树剖

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+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];

void tarjan(int u,int from){
	dfn[u]=low[u]=++tot;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].first;
		if(v==from)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]);
	}
}

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];
void dfs1(int x,int from){
	dep[x]=dep[from]+1;
	fa[x]=from;
	for(int i=0;i<p[x].size();i++){
		int y=p[x][i].first;
		if(y!=from){
			dfs1(y,x);
			num[x]+=num[y];
			if(num[y]>num[son[x]])son[x]=y;
		}
	}num[x]++;
}
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++){
		int y=p[x][i].first,z=p[x][i].second;
		if(y!=from&&y!=son[x]){
			dfs2(y,y,x);
		}nw[z]=in[y];
	}out[x]=tot_time;
}
int w[N*4];
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);
	}
}
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);
	}
}
void replace(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			change(1,col,in[top[x]],in[x],1,2);
			x=fa[top[x]];
		}else {
			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);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&e[i].x,&e[i].y);
		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,i);
	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;
	scanf("%d",&q);
	while(q--){
		scanf("%d%d",&x,&y);
		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])printf("B");
		else {
			int NOW=ask(1,col,nw[i],1);
			if(!NOW)printf("B");
			else if((NOW==1&&dep[co[x]]<dep[co[y]])||(NOW==2&&dep[co[x]]>dep[co[y]]))printf("R");
			else printf("L");
		}
	}
	return 0;
}
2025/2/5 16:55
加载中...