답안 #63155

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
63155 2018-08-01T01:27:33 Z khsoo01 One-Way Streets (CEOI17_oneway) C++11
100 / 100
219 ms 44988 KB
#include<bits/stdc++.h>
#define X first
#define Y second
using namespace std;
typedef pair<int,int> pii;
const int N = 100005;

int n, m, q, ans[N], dep[N], p[N], dir[N];
bool vis[N], bc[N];

vector<int> adj[N];
vector<pii> edg;

struct disj {
	int par[N];
	void init () {iota(par, par+n+1, 0);}
	int Find (int X) {
		if(par[X] == X) return X;
		return par[X] = Find(par[X]);
	}
	void Union (int A, int B) {
		A = Find(A); B = Find(B);
		if(A == B) return;
		par[A] = B;
	}
} uf;

void calc (int C, int P) {
	if(vis[C]) return;
	vis[C] = true;
	dep[C] = dep[P] + 1;
	p[C] = P;
	for(auto &T : adj[C]) calc(T, C);
}

int main() {
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++) {
		int A, B;
		scanf("%d%d",&A,&B);
		edg.push_back({A, B});
		adj[A].push_back(B);
		adj[B].push_back(A);
	}
	for(int i=1;i<=n;i++) {
		if(!vis[i]) calc(i, 0);
	}
	uf.init();
	scanf("%d",&q);
	for(int i=1;i<=q;i++) {
		int A, B;
		scanf("%d%d",&A,&B);
		while(uf.Find(A) != uf.Find(B)) {
			A = uf.Find(A); B = uf.Find(B);
			if(dep[A] > dep[B]) {
				dir[A] = 1;
				uf.Union(A, p[A]);
			}
			else {
				dir[B] = 2;
				uf.Union(B, p[B]);
			}
		}
	}
	uf.init();
	fill(vis+1, vis+1+n, false);
	for(int i=1;i<=n;i++) {
		bool flag = false;
		for(auto &T : adj[i]) {
			if(!flag && T == p[i]) {
				flag = true; continue;
			}
			while(dep[uf.Find(i)] > dep[T]) {
				int I = uf.Find(i);
				bc[I] = true;
				uf.Union(I, p[I]);
			}
		}
	}
	for(int i=0;i<m;i++) {
		if(p[edg[i].X] == edg[i].Y) {
			int I = edg[i].X;
			if(bc[I] || !dir[I]) printf("B");
			else if(dir[I] == 1) printf("R");
			else printf("L");
		}
		else if(p[edg[i].Y] == edg[i].X) {
			int I = edg[i].Y;
			if(bc[I] || !dir[I]) printf("B");
			else if(dir[I] == 1) printf("L");
			else printf("R");
		}
		else printf("B");
	}
	puts("");
}

Compilation message

oneway.cpp: In function 'int main()':
oneway.cpp:37:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&m);
  ~~~~~^~~~~~~~~~~~~~
oneway.cpp:40:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&A,&B);
   ~~~~~^~~~~~~~~~~~~~
oneway.cpp:49:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&q);
  ~~~~~^~~~~~~~~
oneway.cpp:52:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&A,&B);
   ~~~~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 2680 KB Output is correct
2 Correct 5 ms 2688 KB Output is correct
3 Correct 6 ms 2852 KB Output is correct
4 Correct 6 ms 2912 KB Output is correct
5 Correct 7 ms 3040 KB Output is correct
6 Correct 6 ms 3100 KB Output is correct
7 Correct 6 ms 3168 KB Output is correct
8 Correct 5 ms 3256 KB Output is correct
9 Correct 6 ms 3256 KB Output is correct
10 Correct 7 ms 3256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 2680 KB Output is correct
2 Correct 5 ms 2688 KB Output is correct
3 Correct 6 ms 2852 KB Output is correct
4 Correct 6 ms 2912 KB Output is correct
5 Correct 7 ms 3040 KB Output is correct
6 Correct 6 ms 3100 KB Output is correct
7 Correct 6 ms 3168 KB Output is correct
8 Correct 5 ms 3256 KB Output is correct
9 Correct 6 ms 3256 KB Output is correct
10 Correct 7 ms 3256 KB Output is correct
11 Correct 60 ms 7500 KB Output is correct
12 Correct 103 ms 9196 KB Output is correct
13 Correct 108 ms 11268 KB Output is correct
14 Correct 141 ms 13304 KB Output is correct
15 Correct 130 ms 14768 KB Output is correct
16 Correct 124 ms 15468 KB Output is correct
17 Correct 140 ms 17464 KB Output is correct
18 Correct 115 ms 18072 KB Output is correct
19 Correct 90 ms 20248 KB Output is correct
20 Correct 101 ms 20248 KB Output is correct
21 Correct 72 ms 20248 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 2680 KB Output is correct
2 Correct 5 ms 2688 KB Output is correct
3 Correct 6 ms 2852 KB Output is correct
4 Correct 6 ms 2912 KB Output is correct
5 Correct 7 ms 3040 KB Output is correct
6 Correct 6 ms 3100 KB Output is correct
7 Correct 6 ms 3168 KB Output is correct
8 Correct 5 ms 3256 KB Output is correct
9 Correct 6 ms 3256 KB Output is correct
10 Correct 7 ms 3256 KB Output is correct
11 Correct 60 ms 7500 KB Output is correct
12 Correct 103 ms 9196 KB Output is correct
13 Correct 108 ms 11268 KB Output is correct
14 Correct 141 ms 13304 KB Output is correct
15 Correct 130 ms 14768 KB Output is correct
16 Correct 124 ms 15468 KB Output is correct
17 Correct 140 ms 17464 KB Output is correct
18 Correct 115 ms 18072 KB Output is correct
19 Correct 90 ms 20248 KB Output is correct
20 Correct 101 ms 20248 KB Output is correct
21 Correct 72 ms 20248 KB Output is correct
22 Correct 161 ms 24344 KB Output is correct
23 Correct 131 ms 26004 KB Output is correct
24 Correct 219 ms 28324 KB Output is correct
25 Correct 163 ms 32420 KB Output is correct
26 Correct 165 ms 33404 KB Output is correct
27 Correct 151 ms 35240 KB Output is correct
28 Correct 60 ms 35240 KB Output is correct
29 Correct 163 ms 36952 KB Output is correct
30 Correct 119 ms 39212 KB Output is correct
31 Correct 114 ms 41600 KB Output is correct
32 Correct 185 ms 44988 KB Output is correct