제출 #712392

#제출 시각아이디문제언어결과실행 시간메모리
712392danikoynovKeys (IOI21_keys)C++17
0 / 100
29 ms47316 KiB
#include <bits/stdc++.h>
#include "keys.h"

using namespace std;


const int maxn = 3e5 + 10;

struct component
{
    map < int, vector < int > > edges;
    set < int > keys;
    vector < int > vertices;
    int parent, cnt_ver;
    int index;
};

component cp[maxn];
int n, ver_index[maxn];
vector < pair < int, int > > graph[maxn];
vector < int > ans;

int lead[maxn];

void merge_components(int v, int u)
{
    int cnt_edges_v = 0, cnt_edges_u = 0;
    for (int key : cp[v].keys)
        cnt_edges_v += cp[v].edges[key].size();
    for (int key : cp[u].keys)
        cnt_edges_u += cp[u].edges[key].size();

    if (cp[u].keys.size() < cp[v].keys.size())
        swap(cp[u].keys, cp[v].keys);
    for (int key : cp[v].keys)
        cp[u].keys.insert(key);

    if (cnt_edges_v > cnt_edges_u)
        swap(cp[v].edges, cp[u].edges);

    for (int key : cp[u].keys)
        for (int v : cp[v].edges[key])
        cp[u].edges[key].push_back(v);

    if (cp[v].vertices > cp[u].vertices)
        swap(cp[v].vertices, cp[u].vertices);
    for (int vertex : cp[v].vertices)
    cp[u].vertices.push_back(vertex);

    lead[v] = u;
}


int find_leader(int v)
{
    if (v == lead[v])
        return v;
    return (lead[v] = find_leader(lead[v]));
}

vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c)
{
    n = r.size();
    ans.resize(n);

    for (int i = 0; i < u.size(); i ++)
    {
        graph[u[i]].push_back({v[i], c[i]});
        graph[v[i]].push_back({u[i], c[i]});
    }

    queue < int > q;
    for (int i = 0; i < n; i ++)
    {

        lead[i] = i;
        cp[i].keys.insert(r[i]);
        for (pair < int, int > nb : graph[i])
            cp[i].edges[nb.second].push_back(nb.first);
            cp[i].parent = -1;
            cp[i].cnt_ver = 1;
            cp[i].vertices.push_back(i);
            cp[i].index = i;
            ver_index[i] = i;
        q.push(i);
    }

    while(!q.empty())
    {
        int cur = q.front();
        q.pop();
        for (int key : cp[cur].keys)
        {
            if (cp[cur].edges[key].empty())
                continue;
            int to = find_leader(cp[cur].edges[key].back());
            cp[cur].edges[key].pop_back();
            int up = to;
            while(cp[up].parent != -1)
                up = cp[up].parent;
            if (up != cur)
            {
                cp[cur].parent = to;
                break;
            }

            up = find_leader(to);
            while(to != cur)
            {
                int to_go = cp[to].parent;
                merge_components(to, to_go);
                to = to_go;
            }
            q.push(cur);
            break;
        }
    }

    int least = n + 1;
    for (int i = 0; i < n; i ++)
    {
        int v = find_leader(i);
        if (cp[v].parent != -1)
            continue;
        least = min(least, (int)cp[v].vertices.size());
    }

    for (int i = 0; i < n; i ++)
    {
        int v = find_leader(i);
        if (cp[v].parent != -1)
            continue;
            for (int vertex : cp[v].vertices)
                ans[vertex] = 1;
    }

    return ans;
}

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

keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:66:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |     for (int i = 0; i < u.size(); i ++)
      |                     ~~^~~~~~~~~~
keys.cpp:78:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   78 |         for (pair < int, int > nb : graph[i])
      |         ^~~
keys.cpp:80:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   80 |             cp[i].parent = -1;
      |             ^~
keys.cpp:131:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  131 |         if (cp[v].parent != -1)
      |         ^~
keys.cpp:133:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  133 |             for (int vertex : cp[v].vertices)
      |             ^~~
#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...