제출 #730862

#제출 시각아이디문제언어결과실행 시간메모리
730862danikoynovSplit the Attractions (IOI19_split)C++14
29 / 100
127 ms26524 KiB
#include "split.h"
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10;

struct edge
{
    int v, u;

    edge(int _v = 0, int _u = 0)
    {
        v = _v;
        u = _u;
    }
}e[maxn];

int deg[maxn], m, n, A, B, C, type[4];
vector < pair < int, int > > graph[maxn];

int used[maxn], tree_edge[maxn];
vector < int > order;

void dfs(int v)
{
    used[v] = 1;

    for (pair < int, int > nb : graph[v])
    {
        if (used[nb.first] == 1)
            continue;
        tree_edge[nb.second] = 1;
        dfs(nb.first);
    }
}

vector < int > tree[maxn];
int sub[maxn];

void calc(int v, int p)
{
    sub[v] = 1;
    for (int u : tree[v])
    {
        if (u == p)
            continue;
        calc(u, v);
        sub[v] += sub[u];
    }
}

int find_centroid(int v, int p)
{
    for (int u : tree[v])
    {
        if (u == p)
            continue;
        if (sub[u] >= n / 2)
            return find_centroid(u, v);
    }
    return v;
}

vector < vector < int > > cp_list;
vector < int > component;

void trav(int v, int p)
{
    component.push_back(v);
    for (int u : tree[v])
    {
        if (u == p)
            continue;
        trav(u, v);
    }
}

void fill_component(int v, int p, int sz)
{
    component.push_back(v);
    for (int u : tree[v])
    {
        if (component.size() == sz)
        break;
        if (u == p)
            continue;

        fill_component(u, v, sz);
    }
}
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], i});
        graph[q[i]].push_back({p[i], i});
    }

    for (int i = 0; i < m; i ++)
    {
        e[i] = edge(p[i], q[i]);
    }

    dfs(0);
    for (int i = 0; i < m; i ++)
    {
        if (tree_edge[i])
        {
            tree[p[i]].push_back(q[i]);
            tree[q[i]].push_back(p[i]);
        }
    }
    calc(0, -1);
    int centroid = find_centroid(0, -1);
    memset(used, 0, sizeof(used));

    for (int u : tree[centroid])
    {
        component.clear();
        trav(u, centroid);
        cp_list.push_back(component);
    }

    A = a;
    B = b;
    C = c;
    type[1] = 1;
    type[2] = 2;
    type[3] = 3;

    if (A > B)
    {
        swap(A, B);
        swap(type[1], type[2]);
    }

    if (A > C)
    {
        swap(A, C);
        swap(type[1], type[3]);
    }

        if (B > C)
    {
        swap(B, C);
        swap(type[2], type[3]);
    }


    for (int i = 0; i < cp_list.size(); i ++)
    {
        if (cp_list[i].size() >= A)
        {
            vector < int > res(n, 0);
            component.clear();
            fill_component(cp_list[i][0], centroid, A);
            for (int v : component)
                res[v] = type[1];
            component.clear();
            fill_component(centroid, cp_list[i][0], B);
            for (int v : component)
                res[v] = type[2];
            for (int j = 0; j < n; j ++)
                if (res[j] == 0)
                res[j] = type[3];
            return res;
        }
    }
    vector < int > res(n, 0);
    return res;
}

컴파일 시 표준 에러 (stderr) 메시지

split.cpp: In function 'void fill_component(int, int, int)':
split.cpp:84:30: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   84 |         if (component.size() == sz)
      |             ~~~~~~~~~~~~~~~~~^~~~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:96:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |     for (int i = 0; i < p.size(); i ++)
      |                     ~~^~~~~~~~~~
split.cpp:153:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  153 |     for (int i = 0; i < cp_list.size(); i ++)
      |                     ~~^~~~~~~~~~~~~~~~
split.cpp:155:31: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  155 |         if (cp_list[i].size() >= A)
      |             ~~~~~~~~~~~~~~~~~~^~~~
#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...