제출 #1279407

#제출 시각아이디문제언어결과실행 시간메모리
1279407huyngodzzSplit the Attractions (IOI19_split)C++20
29 / 100
44 ms16692 KiB
///huynhocute123///
#include "split.h"
#include<bits/stdc++.h>
using namespace std;
#define S second
#define F first
#define pii pair<int,int>
#define piii pair<int,pair<int,int>>
#define pb push_back
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define REP(i, a, b) for(int i = b; i >= a; --i)
#define ALL(v) v.begin(),v.end()
#define inp(name) if(fopen(name, "r")) freopen(name, "r", stdin);
#define out(name) if(fopen(name, "w")) freopen(name, "w", stdout);
//random_device rd;
//mt19937 rng(rd());
//#pragma GCC optimize ("O3")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("popcnt")
//#define int long long
const int MAX = 1e9+9;
const long long  MAXLL = 1e18+9;
const double pi = 3.14159265358979323846;
const double rad = 3.14159265358979323846 /180;
bool minimize(int &u, int v){
    if(v < u){
        u = v;
        return 1;
    }
    return 0;
}
bool maximize(int &u, int v){
    if(v > u){
        u = v;
        return 1;
    }
    return 0;
}
bool maximizell(long long &u, long long v){
    if(v > u){
        u = v;
        return 1;
    }
    return 0;
}
bool minimizell(long long &u, long long v){
    if(v < u){
        u = v;
        return 1;
    }
    return 0;
}
const int  mod = 1e9 + 7;
inline int fastPow(int a, int n){
    if(n == 0) return 1;
    int t = fastPow(a, n >> 1);
    t = 1ll * t * t % mod;
    if(n & 1) t = 1ll * t * a % mod;
    return t;
}
inline void Add(int& x ,int y){
    x += y;
    if(x >= mod)x -=mod;
}
inline void Sub(int& x, int y){
    x-= y;
    if(x < 0)x += mod;
}
const int maxN = 1e5 + 99 ;
vector<pii> kk;
int n , m;
vector<int> e[maxN];
namespace Tree{
    bool check(){
        return (m <= n);
    }
    int sz[maxN], color[maxN];
    int mn;
    int flag;
    void Fill(int u ,int p, int idx){
        if(kk[idx].F <= 0)return;
//        cerr << u << " " << kk[idx].S << '\n';
        color[u] = kk[idx].S;
        --kk[idx].F;
        for(auto x : e[u]){
            if(x ==p )continue;
            Fill(x ,u , idx);
        }
    }
    void dfs(int u ,int p){
        if(flag == 1)return;
//        cerr << flag << " ";
        sz[u] = 1;
        for(auto x : e[u]){
            if(x == p)continue;
            dfs(x, u);
            sz[u] += sz[x];
        }
        if(flag)return;
        if(sz[u] >= kk[0].F){
            if(n - sz[u] >= kk[0].F){
                if(sz[u]  >= kk[1].F){
//                    cerr <<1 << " "<< u << " " << p << '\n';
                    Fill(u ,p, 1);
                    Fill(p, u , 0);
                    flag = 1;
//                    cerr << flag << " ";
                    return;
                }else if(n - sz[u] >= kk[1].F){
//                    cerr << u << " " << p << '\n';
                    Fill(u ,p, 0);
                    Fill(p, u , 1);
                    flag = 1;
                    return;
                }else assert(0);
                return;
            }

        }
    }
    vector<int> solve(){
        flag =0;
        dfs(0, -1);
        vector<int> ans;
        if(flag == 0){
                FOR(i, 0, n - 1)ans.pb(0);
        }
        else{
            FOR(i, 0, n - 1 ){
                if(color[i] == 0)ans.pb(kk[2].S);
                else ans.pb(color[i]);
            }
        }
        return ans;
    }
}
int lab[maxN];
int Find(int u){
    return  u== lab[u] ? u : lab[u] = Find(lab[u]);
}
bool Merge(int u ,int v){
    u = Find(u);
    v = Find(v);
    if(u == v)return 0;
    lab[v] = u;
    return 1;
}
vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q) {
    n = N;
    FOR(i, 1, n)lab[i] = i;
    kk.pb({a, 1});
    kk.pb({b, 2});
    kk.pb({c, 3});
    m = p.size();
    sort(ALL(kk));
    for(int i = 0 ; i < p.size(); i++){
        int u = p[i], v = q[i];
        if(Merge(u ,v)){
            e[u].pb(v);
            e[v].pb(u);
        }
    }
    if(Tree::check())return Tree::solve();
    vector<int>ans;
    FOR(i, 1 , n)ans.pb(0);
    return ans;
}
//
//inline void solve(){
//    cin >> n >> m;
//    FOR(i, 1, n)lab[i] = i;
//    FOR(i, 1, 3){
//        int x;cin >> x;
//        kk.pb({x, i});
//    }
//    sort(ALL(kk));
//    FOR(i, 1, m){
//        int u ,v;cin >> u >> v;
//        if(Merge(u ,v)){
////            cerr << u << " "<<v << "ADD \n";
//            e[u].pb(v);
//            e[v].pb(u);
//        }
//    }
//    if(!Tree::check()){
//            FOR(i, 1 ,n)cout << 0 << " ";
//            return;
//    }
//
//    vector<int> ans = Tree::solve();
//    for(auto x : ans)cout << x << " ";
//}
//#define NAME "task"
//signed main(){
//    ios_base::sync_with_stdio(false);
//    cin.tie(0);
//    if(fopen(NAME".inp", "r")){
//        freopen(NAME".inp", "r" ,stdin);
////        freopen(NAME".out", "w" ,stdout);
//    }
//    int tc = 1;
//   // cin >> tc;
//    while( tc-- )solve();
//    cerr << '\n' << "Time elapsed: " << (1.0 * clock() / CLOCKS_PER_SEC) << " s\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...