# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
298365 | Rayaabualjamal | Split the Attractions (IOI19_split) | C++14 | 2081 ms | 10976 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "split.h"
#include <cassert>
#include <iostream>
#include <set>
#include <queue>
#include <stack>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <cstdio>
#define rep(i,a,b) for(int i = a; i<b; i++)
#define per(i,a,b) for(int i = a; i>=b; i--)
#define pb push_back
#define se second
using namespace std;
vector <int> ans;
vector < vector <int> > ve;
vector < pair <int, int> > ce;
int dfs(int v){
if(ans[v] == 4|| ans[v]==ce[1].se)return 0;
int cnt = 1;
ans[v]=4;
for(int l:ve[v]){
if(ans[l]!=4&&ans[l]!=ce[1].se){
cnt+=dfs(l);
}
}
return cnt;
}
void bfs2(int v){
int h = ce[0].first;
int d = ce[0].se;
set<int> s;
s.insert(v);
ans[v] = d;
h--;
while(!s.empty()&&h){
int best = *s.begin();
s.erase(s.begin());
for(int k:ve[best]){
if(h&&ans[k]==4){
ans[k]=d;
h--;
s.insert(k);
}
}
}
}
void fix(){
rep(i,0,ans.size()){
if(ans[i]==4){
ans[i]=ce[2].se;
}
}
}
bool bfs(int v){
int h = ce[1].first;
int d = ce[1].se;
queue <int> s;
s.push(v);
ans[v] = d;
h--;
while(!s.empty()&&h){
int best = s.front();
s.pop();
for(int k:ve[best]){
if(h&&ans[k]!=d){
ans[k]=d;
h--;
s.push(k);
}
}
}
//cout << endl;
rep(i,0,ans.size()){
if(ans[i]!=d){
int count = dfs(i);
//cout << v << " " << count << " " << i << endl;
if(count >=ce[0].first){
bfs2(i);
fix();
//cout << "here" << endl;
return true;
}
}
}
return false;
}
bool df(int v){
int h = ce[1].first;
int d = ce[1].se;
stack <int> s;
s.push(v);
ans[v] = d;
h--;
while(!s.empty()&&h){
int best = s.top();
s.pop();
for(int k:ve[best]){
if(h&&ans[k]!=d){
ans[k]=d;
h--;
s.push(k);
}
}
}
//cout << endl;
rep(i,0,ans.size()){
if(ans[i]!=d){
int count = dfs(i);
//cout << v << " " << count << " " << i << endl;
if(count >=ce[0].first){
bfs2(i);
fix();
//cout << "here" << endl;
return true;
}
}
}
return false;
}
vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
ce.pb(make_pair(a, 1));
ce.pb(make_pair(b, 2));
ce.pb(make_pair(c, 3));
sort(ce.begin(), ce.end());
ve.resize(n+1);
rep(i,0,p.size()){
ve[p[i]].pb(q[i]);
ve[q[i]].pb(p[i]);
}
bool f = 0;
rep(i,0,n){
//cout << i << endl;
ans.assign(n,ce[2].se);
if(bfs(i)){
f = 1;
break;
}
ans.assign(n,ce[2].se);
if(df(i)){
f = 1;
break;
}
}
if(f)return ans;
ans.assign(n,0);
return ans;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |