Submission #730775

#TimeUsernameProblemLanguageResultExecution timeMemory
730775danikoynovSplit the Attractions (IOI19_split)C++14
40 / 100
94 ms17052 KiB
#include "split.h"
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10;

int deg[maxn], m, n;
vector < int > graph[maxn];

int used[maxn];
vector < int > order;
void stick(int v)
{
    used[v] = 1;
    order.push_back(v);
    for (int u : graph[v])
    {
        if (!used[u])
            stick(u);
    }
}

void fill_component(int v, int sz)
{
    used[v] = 1;
    order.push_back(v);
    for (int u : graph[v])
    {
        if (order.size() == sz)
            break;
        if (!used[u])
        fill_component(u, sz);
    }
}

vector < int > split;
int t[3], A, B, C, sub[maxn];
bool done = false;
void dfs(int v, int p)
{
    sub[v] = 1;
    for (int u : graph[v])
    {
        if (done)
            break;
        if (u == p)
            continue;
        dfs(u, v);
        if (done)
            break;
        sub[v] += sub[u];
        if (sub[u] >= B && (n - sub[u]) >= A)
        {
            swap(A, B);
            swap(t[0], t[1]);
        }
        if (sub[u] >= A && (n - sub[u]) >= B)
        {
            done = true;
            used[v] = 1;
            fill_component(u, A);
            for (int d : order)
                split[d] = t[0];
            order.clear();
            used[v] = 0;
            fill_component(v, B);
            for (int d : order)
                split[d] = t[1];
            for (int i = 0; i < n; i ++)
                if (split[i] == 0)
                split[i] = t[2];
                break;
        }
    }
}
vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q)
{
    n = N;
    m = p.size();
    for (int i = 0; i < p.size(); i ++)
    {
        graph[p[i]].push_back(q[i]);
        graph[q[i]].push_back(p[i]);
    }

    if (a == 1)
    {
        vector < int > res(n, 0);
        fill_component(0, b);
        for (int v : order)
            res[v] = 2;
        int sp = 0;
        while(res[sp] != 0)
            sp ++;
        res[sp] = 1;
        for (int i = 0; i < n; i ++)
            if (res[i] == 0)
            res[i] = 3;
        return res;
    }

    if (m == n - 1)
    {
        split.resize(n, 0);
        A = a;
        B = b;
        C = c;
        t[0] = 1;
        t[1] = 2;
        t[2] = 3;
        if (A > B)
        {
            swap(A, B);
            swap(t[0], t[1]);
        }
        if (A > C)
        {
            swap(A, C);
            swap(t[0], t[2]);
        }
        if (B > C)
        {
            swap(B, C);
            swap(t[1], t[2]);
        }

        dfs(0, -1);

        return split;
    }
    bool deg2 = true;
    for (int i = 0; i < m; i ++)
    {
        if (graph[i].size() > 2)
        {
            deg2 = false;
            break;
        }
    }

    int leaf = 0;
    while(leaf < n && graph[leaf].size() != 1)
        leaf ++;
    if (leaf == n)
        leaf = 0;
    stick(leaf);

    if (deg2)
    {
        vector < int > res(n);
        for (int i = 0; i < n; i ++)
        {
            int v = order[i];
            if (i < a)
                res[v] = 1;
            else
            if (i < a + b)
            res[v] = 2;
            else
                res[v] = 3;
        }
        return res;
    }
    else
    {
        vector < int > tmp;
        return tmp;
    }

}

Compilation message (stderr)

split.cpp: In function 'void fill_component(int, int)':
split.cpp:30:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   30 |         if (order.size() == sz)
      |             ~~~~~~~~~~~~~^~~~~
split.cpp: In function 'void dfs(int, int)':
split.cpp:70:13: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   70 |             for (int i = 0; i < n; i ++)
      |             ^~~
split.cpp:73:17: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   73 |                 break;
      |                 ^~~~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:81:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |     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...