Submission #314660

#TimeUsernameProblemLanguageResultExecution timeMemory
314660apostoldaniel854Split the Attractions (IOI19_split)C++14
40 / 100
169 ms22392 KiB
#include <bits/stdc++.h>

using namespace std;

#include "split.h"
//#define HOME

using ll = long long;
#define pb push_back
#define dbg(x) cerr << #x << " " < x << "\n"
const int N = 1e5;
vector <pair <int, int>> order;
bool viz[N];
vector <int> gr[N], arb[N];
int sz[N];
void dfsPrec (int node) {
    viz[node] = true;
    sz[node] = 1;
    for (int vec : gr[node])
        if (not viz[vec]) {
            arb[node].pb (vec);
            arb[vec].pb (node);
            dfsPrec (vec);
            sz[node] += sz[vec];
        }
}
int findCentroid (int node, int par) {
    for (int son : arb[node])
        if (son != par && sz[son] * 2 >= sz[0])
            return findCentroid (son, node);
    return node;
}
int in[N], out[N];
int t;
void dfsReroot (int node, int par) {
    sz[node] = 1;
    in[node] = ++t;
    for (int son : arb[node])
        if (son != par) {
            dfsReroot (son, node);
            sz[node] += sz[son];
        }
    out[node] = ++t;
}
vector <int> ans;

void buildAns (int node, int par, int pivot) {
    if (in[pivot] <= in[node] && out[node] <= out[pivot]) {
        if (order[0].first) {
            ans[node] = order[0].second;
            order[0].first--;
        }
    }
    else {
        if (order[1].first) {
            ans[node] = order[1].second;
            order[1].first--;
        }
    }
    for (int son : arb[node])
        if (son != par)
            buildAns (son, node, pivot);
}

vector <int> find_split (int n, int a, int b, int c, vector <int> p, vector <int> q) {
    order.pb ({a, 1});
    order.pb ({b, 2});
    order.pb ({c, 3});
    ans.resize (n, 0);
    sort (order.begin (), order.end ());
    for (int i = 0; i < p.size (); i++) {
        gr[p[i]].pb (q[i]);
        gr[q[i]].pb (p[i]);
    }
    dfsPrec (0);
    int root = findCentroid (0, -1);
    dfsReroot (root, -1);
    int pivot = -1;
    for (int i = 0; i < n; i++)
        if (sz[i] >= order[0].first && sz[i] <= order[0].first + order[2].first)
            pivot = i;
    if (pivot == -1)
        return ans;
    ans.clear ();
    ans.resize (n, order[2].second);
    buildAns (root, -1, pivot);
    return ans;
}
#ifdef HOME
int main () {
    int n, m, a, b, c;
    cin >> n >> m;
    cin >> a >> b >> c;
    vector <int> p (m), q (m);
    for (int i = 0; i < m; i++)
        cin >> p[i] >> q[i];
    vector <int> ans = find_split (n, a, b, c, p, q);
    for (int x : ans)
        cout << x << " ";
    cout << "\n";
    return 0;
}
#endif
/**
    6 5
    2 2 2
    0 1
    1 2
    2 3
    3 4
    4 5
**/

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:71:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |     for (int i = 0; i < p.size (); i++) {
      |                     ~~^~~~~~~~~~~
#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...