Submission #226824

#TimeUsernameProblemLanguageResultExecution timeMemory
226824stefdascaOne-Way Streets (CEOI17_oneway)C++14
100 / 100
129 ms19964 KiB
#include<bits/stdc++.h>
#define god dimasi5eks
#pragma GCC optimize("O3")
#define fi first
#define se second
#define pb push_back
#define pf push_front
 
// #define fisier 1
 
using namespace std;
 
typedef long long ll;
 
const int mod = 1000000007;
const double dancila = 3.14159265359; // PI 
const double eps = 1e-9;
 
 
int n, m, lvl[100002], low[100002], viz[100002];
vector<pair<int, int> > v[100002], v2[100002];
 
pair<int, int> E[100002];
int ans[100002];
void dfs(int dad, int nod)
{
	viz[nod] = 1;
	low[nod] = lvl[nod];
	for(auto vecin : v[nod])
	{
		if(vecin.se == dad)
			continue;
		if(viz[vecin.fi])
		{
			low[nod] = min(low[nod], lvl[vecin.fi]);
			ans[vecin.se] = 1;
			continue;
		}
		lvl[vecin.fi] = lvl[nod] + 1;
		dfs(vecin.se, vecin.fi);
		if(low[vecin.fi] <= lvl[nod])
			ans[vecin.se] = 1;
		low[nod] = min(low[nod], low[vecin.fi]);
	}
}
 
int bcc[100002], bcnt;
void dfs2(int nod, int col)
{
	bcc[nod] = col;
	for(auto vecin : v[nod])
	{
		if(bcc[vecin.fi]) 
			continue;
		if(ans[vecin.se]) 
			dfs2(vecin.fi, col);
		else
		{
			++bcnt;
			v2[col].push_back({bcnt, vecin.se});
			dfs2(vecin.fi, bcnt);
		}
	}
}
 
int dp[100002];
void dfs3(int nod)
{
	for(auto vecin : v2[nod])
	{
		dfs3(vecin.fi);
		if(dp[vecin.fi]>0)
		{
			int u=E[vecin.se].fi;
			if(bcc[u]==vecin.fi) 
				ans[vecin.se]=2;
			else 
				ans[vecin.se]=3;
		}
		else 
			if(dp[vecin.fi]<0)
			{
				int u=E[vecin.se].fi;
				if(bcc[u]==vecin.fi) 
					ans[vecin.se]=3;
				else 
					ans[vecin.se]=2;
			}
			else 
				ans[vecin.se]=1;
		dp[nod]+=dp[vecin.fi];
	}
}
int main()
{
 
    #ifdef fisier
        ifstream f("input.in");
        ofstream g("output.out");
    #endif
 
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
	cin >> n >> m;
	for(int i = 1; i <= m; ++i)
	{
	    int a, b;
	    cin >> a >> b;
	    E[i] = {a, b};
	    v[a].pb({b, i});
	    v[b].pb({a, i});
	}
	
	vector<int> rad;
	for(int i = 1; i <= n; ++i)
		if(!viz[i])
		{
			lvl[i] = 1;
			dfs(0, i);
			++bcnt;
			rad.pb(bcnt);
			dfs2(i, bcnt);
		}
	
	int p;
	cin >> p;
	for(; p; --p)
	{
		int a, b;
		cin >> a >> b;
		if(bcc[a] == bcc[b])
			continue;
		++dp[bcc[a]];
		--dp[bcc[b]];
	}
	
	for(auto it : rad) 
		dfs3(it);
	char ch[5] = "XBRL";
	for(int i = 1; i <= m; ++i)
		cout << ch[ans[i]];
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...