Submission #841595

#TimeUsernameProblemLanguageResultExecution timeMemory
841595AlfraganusSplit the Attractions (IOI19_split)C++17
18 / 100
54 ms12868 KiB
#include "split.h"
// #include "grader.cpp"
#include <bits/stdc++.h>
using namespace std;

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q){
    bool sb1 = true;
    int m = p.size();
    vector<vector<int>> graph(n);
    vector<int> cnt(n);
    for(int i = 0; i < m; i ++){
        graph[p[i]].push_back(q[i]);
        graph[q[i]].push_back(p[i]);
        cnt[p[i]] ++;
        cnt[q[i]] ++;
    }
    for(int i = 0; i < n; i ++){
        if(cnt[i] > 2)
            sb1 = false;
    }
    vector<int> ans(n);
    if(sb1){
        int root = 0;
        for(int i = 0; i < n; i ++){
            if(cnt[i] == 1){
                root = i;
                break;
            }
        }
        queue<int> q;
        int k = 1;
        vector<bool> used(n);
        q.push(root);
        used[root] = true;
        ans[root] = 1;
        while(!q.empty()){
            int x = q.front();
            q.pop();
            
            for(auto neighbour : graph[x]){
                if(!used[neighbour]){
                    used[neighbour] = true;
                    q.push(neighbour);
                    if(k < a)
                        ans[neighbour] = 1;
                    else if(k < a + b)
                        ans[neighbour] = 2;
                    else
                        ans[neighbour] = 3;
                    k ++;
                }
            }
        }
        return ans;
    }
    else if(a == 1){
        queue<int> q;
        q.push(0);
        vector<bool> used(n);
        int k = 1;
        ans[0] = 2;
        used[0] = true;
        while(k < b){
            int x = q.front();
            q.pop();
            
            for(auto neighbour : graph[x]){
                if(!used[neighbour] and k < b){
                    ans[neighbour] = 2;
                    q.push(neighbour);
                    k ++;
                    used[neighbour] = true;
                }
            }
        }
        for(int i = 0; i < n; i ++){
            if(ans[i] == 0){
                ans[i] = 1;
                break;
            }
        }
        for(int i = 0; i < n; i ++){
            if(ans[i] == 0){
                ans[i] = 3;
            }
        }
        return ans;
    }
    else{
        return ans;
    }
}
#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...