제출 #1155095

#제출 시각아이디문제언어결과실행 시간메모리
1155095Math4Life2020Island Hopping (JOI24_island)C++20
2 / 100
2 ms468 KiB
#include "island.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;


map<pii,ll> LOG;

ll QRY(ll v, ll k) {
    if (LOG.find({v,k})==LOG.end()) {
        LOG[{v,k}]=query(v+1,k);
    }
    return LOG[{v,k}];
}

const ll Nm = 305;
ll f[Nm];

ll getf(ll x) {
    if (f[x]==x) {
        return x;
    }
    f[x]=getf(f[x]);
    return f[x];
}

void fz(ll a, ll b) {
    a = getf(a); b = getf(b);
    if (a!=b) {
        f[a]=b;
    }
}

set<pii> cedg;

void ANS(ll x, ll y) {
    if (cedg.find({x,y})!=cedg.end()) {
        return;
    }
    cedg.insert({x,y});
    cedg.insert({y,x});
    answer(x+1,y+1);
    fz(x,y);
}

void solve(int N, int L) {
    ll f1[N];
    for (ll i=0;i<N;i++) {
        f1[i]=QRY(i,1)-1;
    }
    vector<bool> frz(N,false); //frozen?
    vector<bool> flag(N,false);
    for (ll i=0;i<N;i++) {
        if (f1[i]<i && f1[f1[i]]!=i) {
            ANS(i,f1[i]);
        } else if (f1[i]<i && f1[f1[i]]==i) {
            ANS(i,f1[i]);
            ll a1 = QRY(i,2)-1;
            ll a2 = QRY(f1[i],2)-1;
            if (a1==a2) {
                assert(a1>f1[i]);
                flag[i]=1;
                flag[f[i]]=1;
                if (a1<i) {
                    frz[f1[i]]=1;
                    //ANS(i,a1);
                } else {
                    frz[i]=1;
                    frz[f1[i]]=1;
                }
            }
        } else if (f1[i]>i && f1[f1[i]]!=i) {
            ANS(f1[i],i);
            frz[i]=1;
        } else if (f1[i]>i && f1[f1[i]]==i) {
            //already covered
        }
    }
    for (ll T=2;T<N;T++) {
        for (ll i=(N-1);i>=0;i--) {
            if (!frz[i]) {
                ll j = QRY(i,T)-1;
                if (j<i) {
                    if (cedg.find({i,j})==cedg.end()) {
                        if (getf(i)==getf(j)) {
                            frz[i]=1;
                        } else {
                            ANS(i,j);
                        }
                    }
                } else {
                    if (cedg.find({i,j})==cedg.end()) {
                        if (getf(i)==getf(j)) {
                            frz[i]=1;
                        } else {
                            ANS(i,j);
                        }
                    }
                    frz[i]=1;
                }
            }
        }
    }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...