제출 #1291759

#제출 시각아이디문제언어결과실행 시간메모리
1291759goulthenSplit the Attractions (IOI19_split)C++20
0 / 100
86 ms23840 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define pb push_back

using namespace std;
const int MAXN =1e5+10;
vector<int> g[MAXN],t[MAXN];
int deg[MAXN],mk[MAXN];
bool vis[MAXN];

void dfs(int u) {
	if (vis[u]) return;
	vis[u] = 1;

	for (int &v : g[u]) if(!vis[v]) {
		t[u].pb(v);
		t[v].pb(u);
		deg[u]++;
		deg[v]++;
		dfs(v);
	}
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	rep(i,0,p.size()-1) {
		g[p[i]].pb(q[i]);
		g[q[i]].pb(p[i]);
	}

	dfs(1);

	int cnt = 0;
	rep(i,0,n-1) mk[i] = 2;
	//rep(i,0,n-1) cout << mk[i] << '\n';

	vector<int> ord;
	rep(i,0,n-1) if(deg[i] == 1) ord.pb(i);
	while (cnt != a+c) {
		int j = ord.back();ord.pop_back();
		if(cnt==0) mk[j]=1;
		else mk[j]=3;
		++cnt;

		for(int &v : g[j]) {
			if(mk[v]!=2) continue;
			if(--deg[v] == 1) ord.pb(v);
		}
	}

	vector<int> res;
	rep(i,0,n-1) res.pb(mk[i]);
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...