Submission #438585

# Submission time Handle Problem Language Result Execution time Memory
438585 2021-06-28T09:21:54 Z huangqr One-Way Streets (CEOI17_oneway) C++14
100 / 100
148 ms 23996 KB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pl;
const ll lim=1e5+5;
ll n,m,q;
vector<char>ans;

struct UFDS{
	ll par[lim];
	UFDS(){
		for(int i=0;i<lim;i++)par[i]=i;
	}
	ll findset(ll pos){
		if(pos==par[pos])return pos;
		else return par[pos]=findset(par[pos]);
	}
	void mergeset(ll a,ll b){
		a = findset(a),b = findset(b);
		if(a!=b)par[b]=a;
	}
}ufds;

struct Edge{
	ll x,a,b,idx;//x is the other guy, a and b are original order of edge
	Edge(ll xx,ll aa,ll bb,ll ii){
		x=xx,a=aa,b=bb,idx=ii;
	}
	Edge(){}
};

struct Graph{
	vector<Edge>adjl[lim],nontree;
	ll par[lim],depth[lim];
	Edge paredge[lim];
	bool vis[lim],root[lim];
	Graph(){
		fill(vis,vis+lim,0);
		fill(root,root+lim,0);
		fill(depth,depth+lim,0);
		par[1]=1;
		depth[1]=0;
	}
	void dfs(ll pos,ll pre_idx){
		vis[pos]=1;
		for(Edge &E:adjl[pos]){
			if(E.idx==pre_idx){
				swap(E,adjl[pos].back());
				adjl[pos].pop_back();
				break;
			}
		}
		for(Edge E:adjl[pos]){
			if(!vis[E.x]){
				vis[E.x]=1;
				par[E.x]=pos;
				paredge[E.x]=E;
				depth[E.x]=depth[pos]+1;
				dfs(E.x,E.idx);
			}
			else if(pos<E.x){ //prevent duplication (each extra edge goes into nontree once only)
				nontree.push_back(E);
			}
		}
		return;
	}	
	void proc(Edge E){//marks a cycle in the tree
		ll ha=ufds.findset(E.a),hb=ufds.findset(E.b);
		while(ha!=hb){
			if(depth[ha]<depth[hb])swap(ha,hb);
			ufds.mergeset(par[ha],ha);
			ha=ufds.findset(par[ha]);
		}
	}
	void init(){//Part 1, init graph and process the nontree edges
		for(int i=1;i<=n;i++){
			if(vis[i]==0)dfs(i,-1),root[i]=1;
		}
		for(auto E:nontree)proc(E);//mark the cycles
	}
	
	//Part 2, answering the queries
	void query(ll a,ll b){
		ll ha=ufds.findset(a),hb=ufds.findset(b);
		while(ha!=hb){
			if(depth[ha]>depth[hb]){
				ll nxt=ufds.findset(par[ha]);
				ufds.mergeset(nxt,ha);
				Edge E=paredge[ha];
				assert((E.a==ha)^(E.b==ha));
				ans[E.idx]= (E.a==ha)?'R':'L';
				ha=nxt;
			}
			else{
				ll nxt=ufds.findset(par[hb]);
				ufds.mergeset(nxt,hb);
				Edge E=paredge[hb];
				assert((E.a==hb)^(E.b==hb));
				ans[E.idx]= (E.a==hb)?'L':'R';
				hb=nxt;
			}
		}
	}
};

int main(){
	ios_base::sync_with_stdio(0),cin.tie(NULL);
	cin>>n>>m;
	ans=vector<char>(m,'B');//Assume all edges can bidirectional at first
	Graph G;
	for(int i=0;i<m;i++){
		ll a,b;
		cin>>a>>b;
		if(a==b)continue;
		G.adjl[a].push_back(Edge(b,a,b,i));
		G.adjl[b].push_back(Edge(a,a,b,i));
	}
	G.init();
	cin>>q;
	while(q--){
		ll a,b;
		cin>>a>>b;
		G.query(a,b);
	}
	for(char c:ans)cout<<c;
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 8268 KB Output is correct
2 Correct 6 ms 8268 KB Output is correct
3 Correct 7 ms 8396 KB Output is correct
4 Correct 6 ms 8396 KB Output is correct
5 Correct 7 ms 8396 KB Output is correct
6 Correct 6 ms 8396 KB Output is correct
7 Correct 6 ms 8396 KB Output is correct
8 Correct 7 ms 8420 KB Output is correct
9 Correct 7 ms 8376 KB Output is correct
10 Correct 7 ms 8468 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 8268 KB Output is correct
2 Correct 6 ms 8268 KB Output is correct
3 Correct 7 ms 8396 KB Output is correct
4 Correct 6 ms 8396 KB Output is correct
5 Correct 7 ms 8396 KB Output is correct
6 Correct 6 ms 8396 KB Output is correct
7 Correct 6 ms 8396 KB Output is correct
8 Correct 7 ms 8420 KB Output is correct
9 Correct 7 ms 8376 KB Output is correct
10 Correct 7 ms 8468 KB Output is correct
11 Correct 89 ms 23504 KB Output is correct
12 Correct 84 ms 23996 KB Output is correct
13 Correct 97 ms 22208 KB Output is correct
14 Correct 106 ms 20816 KB Output is correct
15 Correct 125 ms 20740 KB Output is correct
16 Correct 118 ms 17228 KB Output is correct
17 Correct 98 ms 18552 KB Output is correct
18 Correct 122 ms 17220 KB Output is correct
19 Correct 100 ms 19652 KB Output is correct
20 Correct 81 ms 20648 KB Output is correct
21 Correct 84 ms 20152 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 8268 KB Output is correct
2 Correct 6 ms 8268 KB Output is correct
3 Correct 7 ms 8396 KB Output is correct
4 Correct 6 ms 8396 KB Output is correct
5 Correct 7 ms 8396 KB Output is correct
6 Correct 6 ms 8396 KB Output is correct
7 Correct 6 ms 8396 KB Output is correct
8 Correct 7 ms 8420 KB Output is correct
9 Correct 7 ms 8376 KB Output is correct
10 Correct 7 ms 8468 KB Output is correct
11 Correct 89 ms 23504 KB Output is correct
12 Correct 84 ms 23996 KB Output is correct
13 Correct 97 ms 22208 KB Output is correct
14 Correct 106 ms 20816 KB Output is correct
15 Correct 125 ms 20740 KB Output is correct
16 Correct 118 ms 17228 KB Output is correct
17 Correct 98 ms 18552 KB Output is correct
18 Correct 122 ms 17220 KB Output is correct
19 Correct 100 ms 19652 KB Output is correct
20 Correct 81 ms 20648 KB Output is correct
21 Correct 84 ms 20152 KB Output is correct
22 Correct 122 ms 18636 KB Output is correct
23 Correct 128 ms 17092 KB Output is correct
24 Correct 132 ms 17132 KB Output is correct
25 Correct 136 ms 21536 KB Output is correct
26 Correct 143 ms 18244 KB Output is correct
27 Correct 123 ms 17224 KB Output is correct
28 Correct 52 ms 20532 KB Output is correct
29 Correct 91 ms 20300 KB Output is correct
30 Correct 92 ms 20236 KB Output is correct
31 Correct 148 ms 20668 KB Output is correct
32 Correct 91 ms 21688 KB Output is correct