Submission #291508

#TimeUsernameProblemLanguageResultExecution timeMemory
291508evpipisSplit the Attractions (IOI19_split)C++14
100 / 100
189 ms20724 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
const int len = 1e5+5;
vector<int> adj[len];
int vis[len], num[len], low[len], par[len], sz[len];
int n, sz1, sz2, sz3, col1, col2, col3, cnt;

void fix(int u){
    num[u] = low[u] = ++cnt;
    sz[u] = 1;

    for (auto v: adj[u]){
        if (!num[v]){
            par[v] = u;
            fix(v);
            sz[u] += sz[v];
            low[u] = min(low[u], low[v]);
        }
        else if (v != par[u] && num[v] < num[u])
            low[u] = min(low[u], num[v]);
    }
}

void add(int u, vector<int> &mys){
    mys.pb(u);

    for (auto v: adj[u]){
        if (par[v] != u) continue;

        add(v, mys);
    }
}

void dfs(int u, vector<int> &mys){
    for (auto v: adj[u]){
        if (par[v] != u) continue;

        if (sz[v] >= sz1)
            return void(dfs(v, mys));
    }

    mys.pb(u);

    vector<int> temp;
    for (auto v: adj[u]){
        if (par[v] != u) continue;

        if (low[v] >= num[u])
            add(v, mys);
        else
            temp.pb(v);
    }

    while (mys.size() < sz1){
        add(temp.back(), mys);
        temp.pop_back();
    }

    return;
}

void paint(int u, int &rem, int col){
    //printf("painting: u = %d, rem = %d, col = %d\n", u, rem, col);
    vis[u] = col, rem--;
    if (rem == 0) return;

    for (auto v: adj[u]){
        if (vis[v]) continue;

        paint(v, rem, col);
        if (rem == 0) return;
    }
}

void print(vector<int> vec){
    for (auto cur: vec)
        printf("%d ", cur);
    printf("\n");
}

vector<int> find_split(int N, int A, int B, int C, vector<int> P, vector<int> Q) {
    n = N;
    sz1 = A, sz2 = B, sz3 = C;
    col1 = 1, col2 = 2, col3 = 3;
    if (sz2 < sz1)
        swap(sz2, sz1), swap(col2, col1);
    if (sz3 < sz1)
        swap(sz3, sz1), swap(col3, col1);
    if (sz3 < sz2)
        swap(sz3, sz2), swap(col3, col2);

	for (int i = 0; i < P.size(); i++){
        int a = P[i], b = Q[i];
        a++, b++;
        adj[a].pb(b);
        adj[b].pb(a);
	}

    fix(1);

    vector<int> fir, sec;
    dfs(1, fir);

    sort(fir.begin(), fir.end());
    for (int i = 1, j = 0; i <= n; i++){
        while (j < fir.size() && fir[j] < i)
            j++;

        if (j < fir.size() && fir[j] == i)
            continue;
        sec.pb(i);
    }

    if (fir.size() >= sec.size())
        swap(fir, sec);

    //printf("fir: "), print(fir);
    //printf("sec: "), print(sec);

    if (fir.size() >= sz1){
        for (auto u: sec)
            vis[u] = col3;
        paint(fir.back(), sz1, col1);
        for (int u: fir)
            if (!vis[u])
                vis[u] = col3;

        for (int u: sec)
            vis[u] = 0;
        paint(sec.back(), sz2, col2);
        for (int u: sec)
            if (!vis[u])
                vis[u] = col3;
    }

	vector<int> out(n, 0);
	for (int i = 1; i <= n; i++)
        out[i-1] = vis[i];
    return out;
}

Compilation message (stderr)

split.cpp: In function 'void dfs(int, std::vector<int>&)':
split.cpp:57:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   57 |     while (mys.size() < sz1){
      |            ~~~~~~~~~~~^~~~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:92:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   92 |     if (sz3 < sz2)
      |     ^~
split.cpp:95:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   95 |  for (int i = 0; i < P.size(); i++){
      |  ^~~
split.cpp:95:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |  for (int i = 0; i < P.size(); i++){
      |                  ~~^~~~~~~~~~
split.cpp:109:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |         while (j < fir.size() && fir[j] < i)
      |                ~~^~~~~~~~~~~~
split.cpp:112:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         if (j < fir.size() && fir[j] == i)
      |             ~~^~~~~~~~~~~~
split.cpp:123:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  123 |     if (fir.size() >= sz1){
      |         ~~~~~~~~~~~^~~~~~
#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...