답안 #918708

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
918708 2024-01-30T09:44:02 Z pan One-Way Streets (CEOI17_oneway) C++17
0 / 100
3000 ms 23480 KB
#include <bits/stdc++.h>
//#include "bits_stdc++.h"
#include <stdio.h>
#include <algorithm>
#include <memory.h>
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define input(x) scanf("%lld", &x);
#define print(x, y) printf("%lld%c", x, y);
#define show(x) cerr << #x << " is " << x << endl;
#define show2(x,y) cerr << #x << " is " << x << " " << #y << " is " << y << endl;
#define show3(x,y,z) cerr << #x << " is " << x << " " << #y << " is " << y << " " << #z << " is " << z << endl;
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ld, ll> pd;
typedef pair<string, ll> psl;
typedef pair<ll, ll> pi;
typedef pair<pi, ll> pii;
ll n, m, x,y, label = -1, q;
vector<ll> ans;
vector<pi> adj[100005];
vector<pi> treeadj[100005];
vector<pi> backadj[100005];
bool tree[100005];
vector<pi> edges;
vector<pi> city;
bool visited[100005], visited2[100005];
ll depth[100005];
ll up[100005], down[100005], dp[100005];
ll bup[100005], bdown[100005], bdp[100005];
int lg(unsigned long long i) {
    return i ? __builtin_clzll(1) - __builtin_clzll(i) : -1;
}

ll k, maxr;
vector<vector<pi > >rmq;
ll fa[100005];
vector<pi> arr;

void dfs1(ll p, ll node) // euler path
{
	visited2[node] = true;
	label++;
	fa[node] = label;
	arr.pb(mp(depth[node], node));
	for (pi u: treeadj[node])
	{
		if (u.f==p || visited2[u.f]) continue;
		depth[u.f] = depth[node]+1;
		dfs1(node, u.f);
		label++;
		arr.pb(mp(depth[node], node));
	}

}

void initrmq()
{
	maxr = arr.size();
	k = lg(maxr);
	rmq.assign(k+5, vector<pi> (maxr));
	rmq[0] = arr;
	for (ll i=1; i<=k; ++i)
	{
		for (ll j=0; j+ (1<<i) < maxr; ++j)
		{
			if (rmq[i-1][j].f < rmq[i-1][j + (1 << (i - 1))].f)
			{
				rmq[i][j] = rmq[i-1][j];
			}
			else
			{
				rmq[i][j] = rmq[i-1][j + (1 << (i - 1))];
			}
			
		}
	}
}

ll lca(ll node1, ll node2)
{
	ll l = fa[node1], r = fa[node2];
	if (l>r) swap(l,r);
	ll i = lg(r-l+1);
	if (rmq[i][l] < rmq[i][r - (1 << i) + 1])
	{
		return rmq[i][l].s;
	}
	else
	{
		return rmq[i][r - (1 << i) + 1].s;
	}
}

void dfs(ll p, ll from)
{
	show2(p, from);
	visited[from]  = true;
	for (pi u: adj[from])
	{
		if (u.f==p) continue;
		if (!visited[u.f])
		{
			tree[u.s] = true;
			treeadj[from].pb(u);
			treeadj[u.f].pb(mp(from, u.s));
			dfs(from, u.f);
		}

	}
}
void mark(ll p, ll node, ll label)
{
	visited[node]  = true;
	ll counter = 0;
	ll bcounter = 0;
	for (pi u: treeadj[node]) 
	{
		if (u.f==p) continue;
		mark(node, u.f, label);
		if (dp[u.f]>0 && bdp[u.f]==0) ans[u.s] = label;
		counter+=dp[u.f];
		bcounter+= bdp[u.f];
	}
	counter+=up[node] - down[node];
	dp[node]  = counter;
	for (pi u: backadj[node])
	{
		if (u.f==node) continue;
		if (lca(u.f, node)==node) bcounter--;
		else bcounter++;
	}
	bdp[node] = bcounter;
	show3(node, dp[node], bdp[node]);
		
}
int main()
{
	input(n); input(m);
	ans.resize(m); edges.resize(m);
	for (ll i=0; i<m; ++i) 
	{
		cin >> x >> y;
		x--;
		y--;
		assert(x!=y);
		adj[x].pb(mp(y, i));
		adj[y].pb(mp(x, i));
		edges[i] = mp(x,y);
	}
	for (ll i=0; i<m; ++i) {tree[i] = 0, ans[i] = 0;}
	for (ll i=0; i<n; ++i) if (!visited[i]) dfs(-1, i);
	label= -1;
	depth[0] = 0;
	for (ll i=0; i<n; ++i) if (!visited2[i])dfs1(-1, i);
	initrmq();

	for (ll i=0; i<m; ++i)
	{
		if (!tree[i])
		{
			backadj[edges[i].f].pb(mp(edges[i].s, i));
			backadj[edges[i].s].pb(mp(edges[i].f, i));
			show2(edges[i].s, edges[i].f);
		}
	}
	cin >> q;
	city.resize(q);
	for (ll i=0; i<q; ++i) {cin >> city[i].f >> city[i].s; city[i].f--; city[i].s--;}
	for (ll i=0; i<n; i++) {up[i] = 0, down[i] = 0, dp[i] = 0, bup[i] = 0, bdown[i] = 0, bdp[i]= 0; visited[i] = false;}
	for (ll i=0; i<q; ++i)
	{
		ll mid = lca(city[i].f, city[i].s);
		if (mid==city[i].f) continue;
		up[city[i].f]++;
		down[mid]++;
	}
	for (ll i=0;i<n; ++i) show3(i, up[i], down[i]);
	for (ll i=0; i<n; ++i) for (ll j=0; j<n; ++j) show3(i+1 ,j+1 , lca(i,j)+1);
	for (ll i=0; i<n; ++i) if (!visited[i]) mark(-1, i, 1); // go up
	for (ll i=0; i<n; i++) {up[i] = 0, down[i] = 0, dp[i] = 0, bup[i] = 0, bdown[i] = 0, bdp[i]= 0;visited[i] = false;}
	for (ll i=0; i<q; ++i)
	{
		ll mid = lca(city[i].f, city[i].s);
		if (mid==city[i].s) continue;
		up[city[i].s]++;
		down[mid]++;
	}
	for (ll i=0; i<n; ++i) if (!visited[i]) mark(-1, i, 2);// go down
	for (ll i=0; i<m; ++i)
	{
		ll mid =  lca(edges[i].f, edges[i].s);
		if (!tree[i] || ans[i]==0) cout << 'B';
		else if ((ans[i]==1 && mid!=edges[i].f) || (ans[i]==2 && mid!=edges[i].s)) cout << 'R';
		else  cout << 'L';
	}
	cout << endl;
	
	
	return 0;
}

Compilation message

oneway.cpp: In function 'int main()':
oneway.cpp:12:23: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 | #define input(x) scanf("%lld", &x);
      |                  ~~~~~^~~~~~~~~~~~
oneway.cpp:144:2: note: in expansion of macro 'input'
  144 |  input(n); input(m);
      |  ^~~~~
oneway.cpp:12:23: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 | #define input(x) scanf("%lld", &x);
      |                  ~~~~~^~~~~~~~~~~~
oneway.cpp:144:12: note: in expansion of macro 'input'
  144 |  input(n); input(m);
      |            ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 13656 KB Output is correct
2 Correct 11 ms 13660 KB Output is correct
3 Execution timed out 3044 ms 23480 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 13656 KB Output is correct
2 Correct 11 ms 13660 KB Output is correct
3 Execution timed out 3044 ms 23480 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 13656 KB Output is correct
2 Correct 11 ms 13660 KB Output is correct
3 Execution timed out 3044 ms 23480 KB Time limit exceeded
4 Halted 0 ms 0 KB -