Submission #260659

#TimeUsernameProblemLanguageResultExecution timeMemory
260659HideoSplit the Attractions (IOI19_split)C++17
100 / 100
181 ms21104 KiB
#include "split.h"
//#include "grader.cpp"
#include <bits/stdc++.h>

using namespace std;

#define all(s) s.begin(), s.end()
#define ok puts("ok")
#define ll long long
#define pb push_back
#define mk make_pair
#define fr first
#define sc second
#define vi vector < int >
#define pi pair < int, int >

const int MAXN = 2e5 + 7;
const int INF = 1e9 + 7;

int tin[MAXN], tim;
int clr[MAXN];
int h[MAXN], sz[MAXN], mn[MAXN];
int x, y, z;

vi g[MAXN], palette;

bool invalid = false;

void precalc (int v, int p = 0){
    tin[v] = ++tim;
    clr[v] = palette[1];
    h[v] = h[p] + 1;
    sz[v] = 1;
    mn[v] = h[v];
    for (int to : g[v]){
        if (!h[to]){
            precalc(to, v);
            sz[v] += sz[to];
            mn[v] = min(mn[v], mn[to]);
        }
        else
            mn[v] = min(mn[v], h[to]);
    }
}

void paint_main (int v, int cclr = 0){
    if (cclr == 0 && clr[v] == palette[1]){
        x--; y++;
    }
    else if (cclr == 1 && clr[v] == palette[0]){
        x++; y--;
    }
    clr[v] = palette[cclr];
    for (int to : g[v])
        if (h[to] - h[v] == 1)
            paint_main(to, cclr);
}

void paint (int v, int point){
    if (y <= 0)
        return;
    if (mn[v] < point)
        paint_main(v, 1);
    else {
        for (int to : g[v])
            if (h[to] - h[v] == 1 && y > 0)
                paint(to, point);
    }
}

void dfs (int v){
    pi mx = {0, 0};
    for (int to : g[v])
        if (h[to] - h[v] == 1 && mx.fr < sz[to])
            mx = {sz[to], to};
    if (x < mx.fr)
        dfs(mx.sc);
    else {
        paint_main(v);
        for (int to : g[v])
            if (h[to] - h[v] == 1 && y > 0)
                paint(to, h[v]);
        if (y > 0)
            invalid = true;
    }
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
    if (a >= b && a >= c){
        if (b >= c){
            palette = {2, 3, 1};
            swap(b, c);
        }
        else
            palette = {3, 2, 1};
        swap(a, c);
    }
    else if (b >= a && b >= c){
        if (a >= c)
            palette = {1, 3, 2};
        else {
            palette = {3, 1, 2};
            swap(a, c);
        }
        swap(b, c);
    }
    else {
        if (b >= a){
            palette = {2, 1, 3};
            swap(a, b);
        }
        else
            palette = {1, 2, 3};
    }
    x = a;
    y = b;
    z = c;
    for (int i = 0; i < p.size(); i++){
        g[p[i] + 1].pb(q[i] + 1);
        g[q[i] + 1].pb(p[i] + 1);
    }
    vector < int > res;

    precalc(1);
    y -= n;
    bool stop = false;
    for (int i = 2; i <= n; i++){
        if (sz[i] >= a && sz[1] - sz[i] >= b){
            paint_main(i);
            stop = true;
            break;
        }
        if (sz[i] >= b && sz[1] - sz[i] >= a){
            paint_main(1);
            paint_main(i, 1);
            stop = true;
            break;
        }
    }
    if (stop == false)
        dfs(1);
    if (invalid == true)
        while (res.size() < n)
            res.pb(0);
    else {
        vector < pi > temp;
        for (int i = 1; i <= n; i++)
            temp.pb({tin[i], i});
        sort(all(temp));
        for (int i = n - 1; i >= 0; i--){
            if (clr[temp[i].sc] == palette[0] && x < 0){
                clr[temp[i].sc] = palette[2];
                x++;
            }
            else if (clr[temp[i].sc] == palette[1] && y < 0){
                clr[temp[i].sc] = palette[2];
                y++;
            }
        }
        for (int i = 1; i <= n; i++)
            res.pb(clr[i]);
    }
	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:118:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < p.size(); i++){
                     ~~^~~~~~~~~~
split.cpp:143:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (res.size() < n)
                ~~~~~~~~~~~^~~
#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...