Submission #715724

#TimeUsernameProblemLanguageResultExecution timeMemory
715724lmqzzzSplit the Attractions (IOI19_split)C++14
100 / 100
148 ms25292 KiB
#include "split.h"

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 10;

vector<int> adj[MAXN];
vector<int> g[MAXN];
int num[MAXN], low[MAXN], timer = 0;
int sz[MAXN];
int par[MAXN];
int ans[MAXN];
int color[MAXN];

void dfs(int u, int p) {
        par[u] = p;
        num[u] = low[u] = ++timer;
        sz[u] = 1;
        for (int v : adj[u]) {
                if (v == p) continue;
                if (num[v]) {
                        low[u] = min(low[u], num[v]);
                } else {
                        g[u].emplace_back(v);
                        g[v].emplace_back(u);
                        dfs(v, u);
                        low[u] = min(low[u], low[v]);
                        sz[u] += sz[v];
                }
        }
}

void dfsans(int u, int p, int id, int cur, int& cnt, vector<int>* adj) {
        if (color[u] != cur) return;
        if (cnt == 0) return;
        cnt--;
        color[u] = id;
        for (int v : adj[u]) {
                if (v == p) continue;
                dfsans(v, u, id, cur, cnt, adj);
                if (cnt == 0) return;
        }
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
        int aa = a, bb = b, cc = c;
        map<int, int> mp;
        mp[0] = 1;
        mp[1] = 2;
        mp[2] = 3;
        if (a > b) swap(a, b), swap(mp[0], mp[1]);
        if (a > c) swap(a, c), swap(mp[0], mp[2]);
        if (b > c) swap(b, c), swap(mp[1], mp[2]);
        vector<int> res(n, 0);
        int m = p.size();
        for (int i = 0; i < m; i++) {
                adj[p[i]].emplace_back(q[i]);
                adj[q[i]].emplace_back(p[i]);
        }
        dfs(0, -1);
        int best_subtree = -1;
        int best_size = n + 1;
        for (int i = 0; i < n; i++) {
                int subtree_size = sz[i];
                if (subtree_size >= a) {
                        if (subtree_size < best_size) {
                                best_size = subtree_size;
                                best_subtree = i;
                        }
                }
        }

        for (int i = 0; i < n; i++) color[i] = 4;
        int x = 1e9;
        dfsans(best_subtree, par[best_subtree], 3, 4, x, g);

        int notsubtree_size = n - best_size;

        for (int v : g[best_subtree]) {
                if (notsubtree_size >= a) break;
                if (v == par[best_subtree]) continue;
                if (low[v] >= num[best_subtree]) continue;

                notsubtree_size += sz[v];
                best_size -= sz[v];
                dfsans(v, best_subtree, 4, 3, x, g);
        }

        if (notsubtree_size < a) return res;

        if (notsubtree_size >= b) {
                dfsans(0, -1, 1, 4, b, adj);
                dfsans(best_subtree, -1, 0, 3, a, adj);
        } else {
                assert(best_size >= b);
                dfsans(0, -1, 0, 4, a, adj);
                dfsans(best_subtree, -1, 1, 3, b, adj);
        }

        for (int i = 0; i < n; i++) {
                res[i] = mp[min(color[i], 2)];
        }

        return res;
}

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:48:13: warning: unused variable 'aa' [-Wunused-variable]
   48 |         int aa = a, bb = b, cc = c;
      |             ^~
split.cpp:48:21: warning: unused variable 'bb' [-Wunused-variable]
   48 |         int aa = a, bb = b, cc = c;
      |                     ^~
split.cpp:48:29: warning: unused variable 'cc' [-Wunused-variable]
   48 |         int aa = a, bb = b, cc = c;
      |                             ^~
#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...