Submission #1244524

#TimeUsernameProblemLanguageResultExecution timeMemory
1244524uroskICC (CEOI16_icc)C++20
100 / 100
76 ms628 KiB
#include "bits/stdc++.h"
#include "icc.h"
#define pb push_back
#define si(a_) (ll)(a_.size())

using namespace std;

using ll = int;

const ll maxn = 105;
const ll lg = 7;
ll n;
ll a[maxn];
ll b[maxn];
ll c[maxn];
ll asz = 0,bsz = 0,csz = 0;
ll dsu[maxn];
vector<ll> v[maxn];
set<ll> s;
ll root(ll x){
    while(x!=dsu[x]){
        x = dsu[x];
    }
    return x;
}
void upd(ll x,ll y){
    x = root(x), y = root(y);
    dsu[y] = x;
    for(ll u : v[y]) v[x].pb(u);
}
void run(ll N){
    n = N;
    for(ll i = 1;i<=n;i++){
        v[i].pb(i);
        dsu[i] = i;
    }
    // freopen("out.txt","w",stdout);
    for(ll ff = 0;ff<n-1;ff++){
        vector<ll> rut;
        s.clear();
        for(ll i = 1;i<=n;i++) s.insert(root(i));
        for(ll x : s) rut.pb(x);
        // cout<<"RUT: "<<endl;
        // for(ll x : s) cout<<x<< " "; cout<<endl;
        for(ll j = 0;j<lg;j++){
            asz = 0,bsz = 0;
            for(ll i = 0;i<si(rut);i++){
                if((1<<j)&i){
                    for(ll x : v[rut[i]]) a[asz++] = x;
                }else{
                    for(ll x : v[rut[i]]) b[bsz++] = x;
                }
            }
            // for(ll k = 0;k<asz;k++) cout<<a[k]<< " ";cout<<endl;
            // for(ll k = 0;k<bsz;k++) cout<<b[k]<< " ";cout<<endl;
            if(query(asz,bsz,a,b)){
                ll tl = 0,tr = bsz-1,mid;
                while(tl<tr){
                    mid = (tl+tr)/2;
                    csz = 0;
                    for(ll i = tl;i<=mid;i++) c[csz++] = b[i];
                    if(query(asz,csz,a,c)) tr = mid;
                    else tl = mid+1;
                }
                b[0] = b[tl];
                bsz = 1;
                tl = 0,tr = asz-1,mid;
                while(tl<tr){
                    mid = (tl+tr)/2;
                    csz = 0;
                    for(ll i = tl;i<=mid;i++) c[csz++] = a[i];
                    if(query(csz,bsz,c,b)) tr = mid;
                    else tl = mid+1;
                }
                setRoad(b[0],a[tl]);
                upd(b[0],a[tl]);
                // cout<<"rod: "<<b[0]<< " "<<a[tl]<<endl;
                break;
            }
        }
    }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...