답안 #1025767

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1025767 2024-07-17T09:47:01 Z Taxiradio One-Way Streets (CEOI17_oneway) C++17
0 / 100
0 ms 344 KB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;

vector<array<int , 2>> es;
vector<vector<array<int , 2>>> g1;
vector<int> comp , l, ti;
stack<int> u;
int t = 1 , c = 0; 

void dfs(int p , int b){
	l[p] = ti[p] = t++;
	u.push(p);
	for(auto [x , i]: g1[p]){
		if(b == i)continue;
		if(ti[x] == 0){
			dfs(x , i);
			if(l[x] > ti[p]){
				while(true){
					comp[u.top()] = c;
					if(u.top() == x){
						u.pop();
						break;
					}
					u.pop();
				}
				c++;
			}
			l[p] = min(l[p] , l[x]);
			continue;
		}
		l[p] = min(l[p] , ti[x]);
	}
}

vector<vector<array<int , 2>>> g2;
vector<bool> vis;

void dfs(int p){
	vis[p] = 1;
	for(auto [x , i]: g1[p]){
		if(vis[x])continue;
		if(comp[x] != comp[p]){
			g2[comp[x]].push_back({comp[p] , i});
			g2[comp[p]].push_back({comp[x] , i});
			//cout << comp[x] << " " << comp[p] << endl;
		}
		dfs(x);
	}
}

vector<array<int , 28>> bl;
vector<int> f;
vector<array<int , 2>> k;
void bls(int p , int e , int y){
	bl[p][0] = e;
	//cout << p << " " << e << endl;
	if(e==-1)f[p] = 0;else f[p] = f[e]+1;
	k[p][0] = e;
	k[p][1] = y;
	for(int i = 1; i < 28; i++){
		if(bl[p][i-1] == -1){
			bl[p][i] = -1;
			continue;
		}
		bl[p][i] = bl[bl[p][i-1]][i-1];
	}
	for(auto [x, i] : g2[p]){
		if(x==e)continue;
		bls(x , p , i);
	}
}

int get(int a , int b){
	if(f[a] < f[b])swap(a , b);
	for(int i = 27; i >=0; i--){
		if((1<<i) <= f[a]-f[b])a = bl[a][i];
	}
	if(a==b)return a;
	for(int i = 27; i >=0; i--){
		if(bl[a][i] != bl[b][i]){
			a = bl[a][i];
			b = bl[b][i];
		}
	}
	return bl[a][0];
}
vector<array<int , 3>> v;
vector<int> ans;
void solve(int i){
	//cout << v[i][0] << " " << v[i][1] << " " << v[i][2] << endl;
	int a = v[i][1];
	while(f[a] != v[i][0]){
		if(ans[k[a][1]] != 0)break;
		//cout << a << " " << k[a][0] << " " << k[a][1] << endl;
		if(comp[es[k[a][1]][0]] == a){
			ans[k[a][1]] = v[i][2];
		}else{
			ans[k[a][1]] = v[i][2]*-1;
		}
		a = k[a][0];
	}
}

int main() {
	int n , m; cin >> n >> m;
	g1.resize(n);
	comp.resize(n);
	l.resize(n);
	ti.resize(n);
	for(int i = 0; i < m; i++){
		int a , b; cin >> a >> b;
		g1[a-1].push_back({b-1 , i});
		g1[b-1].push_back({a-1 , i});
		es.push_back({a-1 , b-1});
	}
	vis.resize(n , false);
	g2.resize(n);
	for(int i = 0; i < n; i++){
		if(ti[i] == 0){
			dfs(0 , -1);
			while(!u.empty()){
				comp[u.top()] = c;
				u.pop();
			}
			dfs(0);
		}
	}
	c++;
	/*
	for(int i = 0; i < n; i++){
		cout << comp[i] << " ";
	}
	*/
	bl.resize(c);
	k.resize(c);
	f.resize(c);
	bls(0 , -1 , -1);
	int q; cin >> q;
	for(int i = 0; i < q; i++){
		int a , b; cin >> a >> b;
		a--;
		b--;
		int d = get(comp[a] , comp[b]);
		v.push_back({f[d] , comp[a] , -1});
		v.push_back({f[d] , comp[b] , 1});
	}
	sort(v.begin() , v.end());
	ans.resize(m, 0);
	for(int i = 0; i < v.size(); i++){
		solve(i);
	}
	//cout << "a "<<endl;
	for(int x : ans){
		if(x == 0)cout << "B";
		if(x == 1)cout << "L";
		if(x == -1)cout << "R";
	}
	cout << endl;
}

Compilation message

oneway.cpp: In function 'int main()':
oneway.cpp:151:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  151 |  for(int i = 0; i < v.size(); i++){
      |                 ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -