Submission #1229340

#TimeUsernameProblemLanguageResultExecution timeMemory
1229340GraySplit the Attractions (IOI19_split)C++20
22 / 100
555 ms1114112 KiB
#include "split.h"
#include<bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define ln "\n"
using namespace std;

vector<vector<int>> A;
vector<ll> sz;   ll n;
bool found=0;

void build(ll u, ll p, vector<int> &vals, ll wr, ll &cnt){
    vals[u]=wr; cnt--;
    if (cnt==0) return;
    for (auto v:A[u]){
        if (v==p) continue;
        build(v, u, vals, wr, cnt);
        if (cnt==0) return;
    }
}

void dfs(ll u, ll p, vector<array<ll, 2>> &cs, vector<int> &vals){
    vector<pair<ll, ll>> szs; ll csz=1;
    for (auto v:A[u]){
        if (v==p) continue;
        dfs(v, u, cs, vals);
        if (found) return;
        csz+=sz[v]; szs.push_back({sz[v], u});
    }
    if (u!=p) szs.push_back({n-csz, p});
    sort(szs.rbegin(), szs.rend());
    for (ll i=0; i<(ll)szs.size(); i++){
        if (szs[i].ff>=cs[1][0] and n-szs[i].ff>=cs[0][0]){
            found=1; vals.assign(n, cs[2][1]);
            build(szs[i].ss, u, vals, cs[1][1], cs[1][0]);
            build(u, szs[i].ss, vals, cs[0][1], cs[0][0]);
            return;
        }
        if (szs[i].ff>=cs[0][0] and n-szs[i].ff>=cs[1][0]){
            found=1; vals.assign(n, cs[2][1]);
            build(szs[i].ss, u, vals, cs[0][1], cs[0][0]);
            build(u, szs[i].ss, vals, cs[1][1], cs[1][0]);
            return;
        }
    }
    sz[u]=csz;
}

vector<int> find_split(int N, int ca, int cb, int cc, vector<int> p, vector<int> q) {
    A.clear(); sz.clear(); found=0;
    n=N; A.resize(n);
    for (ll i=0; i<(ll)p.size(); i++){
        A[p[i]].push_back(q[i]);
        A[q[i]].push_back(p[i]);
    }
    vector<array<ll, 2>> a = {{ca, 1}, {cb, 2}, {cc, 3}};
    sort(a.begin(), a.end()); sz.resize(n);
    vector<int> res;
    dfs(0, 0, a, res);
    if (found) return res;
    else return vector<int>(n, 0);
}
#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...