Submission #433054

#TimeUsernameProblemLanguageResultExecution timeMemory
433054MatijaLSplit the Attractions (IOI19_split)C++14
22 / 100
525 ms1048580 KiB
/**
 * Author: MatijaL
 * Time: 2021-06-18 20:13:08
**/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pll pair<ll, ll>
#define loop(i, n) for(ll i = 0; i < n; i++)
#define FOR(i,n,m) for(ll i = n; i <= m; i++)
#define isIn(vec, item) find(vec.begin(), vec.end(), item) != vec.end()
#define fs first
#define sc second
#define pb push_back
#define mp make_pair
#define all(v) v.begin(),v.end()
#define inf 1000000005
#define mod 1000000007
#define print(v) for(auto e : v) cout << e << " "; cout << endl;

#define DEBUG 1

int N;

vector<int> ans;
vector<int> sosedi[200500];
int subtreesize[200500];

int chosenBranch = -1;
int miniColor, midiColor;

void dfs(int node, int prev){
    subtreesize[node] = 1;
    for(auto e : sosedi[node]){
        if(e != prev) {
            dfs(e, node);
            subtreesize[node] += subtreesize[e];
        }
    }
    //printf("subtreesize of %d is %d\n", node, subtreesize[node]);
    return;
}

void dfsFill(int node, int prev, int rem, int color){
    //printf("dfs fill %d %d %d\n", node, rem, color);
    if(node == prev){
        //zacetek
        if(color == miniColor) dfsFill(chosenBranch, node, rem, color);
        else{
            ans[node] = midiColor;
            rem--;
            for(auto e : sosedi[node]){
                if(rem <= 0) break;
                if(e != chosenBranch) {
                    dfsFill(e, node, min(subtreesize[e], rem), color);
                    rem -= subtreesize[e];
                }
                       
            }
        }
    }else{
        ans[node] = color;
        rem--;
        for(auto e : sosedi[node]){
            if(rem <= 0 or e == prev) continue;
            dfsFill(e, node, min(subtreesize[e], rem), color);
            rem -= subtreesize[e];
        }
    }
}

int largest(int node){
    int mx = 0;
    int mxe = 0;
    for(auto e : sosedi[node]){
        if(subtreesize[e] < subtreesize[node]){
            if(subtreesize[e] > mx){
                mx = subtreesize[e];
                mxe = e;
            }
        }
        else{
            if(N - subtreesize[node]> mx){
                mx = N - subtreesize[node];
                mxe = e; 
            }
        }
    }
    //printf("largest of %d is %d with size %d\n", node, mxe, mx);
    if(mx > N/2) return mxe;
    else return -1;
}



vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q){
    N = n;
    loop(i, p.size()){
        sosedi[p[i]].pb(q[i]);
        sosedi[q[i]].pb(p[i]);
    }
    
    
    

    int mini = min(a, min(b, c));
    int midi = a + b + c - mini - max(a, max(b, c));

    dfs(0, 0);
    int centroid = 0;
    while(largest(centroid) != -1) centroid = largest(centroid);
    dfs(centroid, centroid);

    //printf("centroid is %d\n", centroid);

    for(auto e : sosedi[centroid])
        if(subtreesize[e] >= mini){
            chosenBranch = e;
            break;
        }

    if(chosenBranch == -1){
        // zafukali smo
        ans.resize(n, 0);
        return ans;
    }

    //printf("selectedBranch is %d\n", chosenBranch);

    if(a == mini) miniColor = 1;
    else if(b == mini) miniColor = 2;
    else miniColor = 3;

    if(c == midi) midiColor = 3;
    else if(b == midi) midiColor = 2;
    else midiColor = 1;

    ans.resize(n, 6 - midiColor - miniColor);
    dfsFill(centroid, centroid, mini, miniColor);
    dfsFill(centroid, centroid, midi, midiColor);

    return ans;
}

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:10:36: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   10 | #define loop(i, n) for(ll i = 0; i < n; i++)
......
   99 |     loop(i, p.size()){
      |          ~~~~~~~~~~~                
split.cpp:99:5: note: in expansion of macro 'loop'
   99 |     loop(i, p.size()){
      |     ^~~~
#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...