Submission #290939

#TimeUsernameProblemLanguageResultExecution timeMemory
290939alexandra_udristoiuSplit the Attractions (IOI19_split)C++14
18 / 100
137 ms14940 KiB
#include "split.h"
#include<vector>
#define DIM 100005
using namespace std;
static int viz[DIM], t[DIM], ind[5], d[DIM], e[DIM], niv[DIM];
static vector<int> v[DIM], sol;
static void dfs(int nod){
    d[nod] = 1;
    e[nod] = niv[nod];
    viz[nod] = 1;
    for(int i = 0; i < v[nod].size(); i++){
        int vecin = v[nod][i];
        if(viz[vecin] == 0){
            niv[vecin] = niv[nod] + 1;
            t[vecin] = nod;
            dfs(vecin);
            d[nod] += d[vecin];
            e[nod] = min(e[nod], e[vecin]);
        }
        else if(vecin != t[nod]){
            e[nod] = min(e[nod], niv[vecin]);
        }
    }
}
static void dfs2(int nod, int ind, int &s, int nr){
    if(s < nr){
        s++;
        sol[nod] = ind;
    }
    else{
        return;
    }
    for(int i = 0; i < v[nod].size(); i++){
        if(sol[ v[nod][i] ] == 0 && t[ v[nod][i] ] == nod){
            dfs2(v[nod][i], ind, s, nr);
        }
    }
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
    int i, j, sum, ok, sa, sb, nod;
    ind[1] = 1;
    ind[2] = 2;
    ind[3] = 3;
    if(a > b){
        swap(a, b);
        swap(ind[1], ind[2]);
    }
    if(a > c){
        swap(a, c);
        swap(ind[1], ind[3]);
    }
    if(b > c){
        swap(b, c);
        swap(ind[2], ind[3]);
    }
    for(i = 0; i < p.size(); i++){
        v[ p[i] ].push_back(q[i]);
        v[ q[i] ].push_back(p[i]);
    }
    dfs(0);
    ok = 0;
    sol.resize(n);
    for(i = 1; i < n && ok == 0; i++){
        sum = d[i];
        for(j = 0; j < v[i].size(); j++){
            if(sum >= a && n - sum >= b){
                ok = 1;
                break;
            }
            nod = v[i][j];
            if(t[nod] == i && e[nod] < niv[i]){
                sum -= d[nod];
            }
        }
        if(ok == 1){
            sa = sb = 0;
            sol[i] = ind[1];
            sol[ t[i] ] = ind[2];
            for(j = j - 1; j >= 0; j--){
                 nod = v[i][j];
                if(t[nod] == i && e[nod] < niv[i]){
                    dfs2(nod, ind[2], sb, b);
                }
            }
            dfs2(i, ind[1], sa, a);
            for(j = t[i]; sb < b; j = t[j]){
                dfs2(j, ind[2], sb, b);
            }
            continue;
        }

        sum = d[i];
        for(j = 0; j < v[i].size(); j++){
            if(sum >= b && n - sum >= a){
                ok = 1;
                break;
            }
            nod = v[i][j];
            if(t[nod] == i && e[nod] < niv[i]){
                sum -= d[nod];
            }
        }
        if(ok == 1){
            sa = sb = 0;
            sol[i] = ind[2];
            sol[ t[i] ] = ind[1];
            for(j = j - 1; j >= 0; j--){
                 nod = v[i][j];
                if(t[nod] == i && e[nod] < niv[i]){
                    dfs2(nod, ind[1], sa, a);
                }
            }
            dfs2(i, ind[2], sb, b);
            for(j = t[i]; sb < b; j = t[j]){
                dfs2(j, ind[2], sb, b);
            }
        }
    }
    if(ok == 1){
        for(i = 0; i < n; i++){
            if(sol[i] == 0){
                sol[i] = ind[3];
            }
        }
    }
    return sol;
}

Compilation message (stderr)

split.cpp: In function 'void dfs(int)':
split.cpp:11:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   11 |     for(int i = 0; i < v[nod].size(); i++){
      |                    ~~^~~~~~~~~~~~~~~
split.cpp: In function 'void dfs2(int, int, int&, int)':
split.cpp:33:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |     for(int i = 0; i < v[nod].size(); i++){
      |                    ~~^~~~~~~~~~~~~~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:57:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for(i = 0; i < p.size(); i++){
      |                ~~^~~~~~~~~~
split.cpp:66:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |         for(j = 0; j < v[i].size(); j++){
      |                    ~~^~~~~~~~~~~~~
split.cpp:94:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |         for(j = 0; j < v[i].size(); j++){
      |                    ~~^~~~~~~~~~~~~
#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...