제출 #1158057

#제출 시각아이디문제언어결과실행 시간메모리
1158057heeheeheehaaw자매 도시 (APIO20_swap)C++20
0 / 100
2103 ms289664 KiB
#include <bits/stdc++.h>
#include "swap.h"

using namespace std;

typedef long double ld;
typedef long long ll;
const int bucketsize = 200;
const int obsize = 200000 / bucketsize;
//#define int long long

struct DSU
{
    vector<int> deg, parent, siz;
    vector<int> cdeg, cparent, csiz;
    vector<char> maxdeg, cmaxdeg;
    vector<int> modif;
    vector<bool> apare, earb, cearb;

    void init(int n)
    {
        deg.resize(n);
        siz.resize(n);
        parent.resize(n);
        maxdeg.resize(n);
        apare.resize(n);
        earb.resize(n);
        for (int i = 0; i < n; i++)
        {
            parent[i] = i;
            siz[i] = 1;
            maxdeg[i] = deg[i] = 0;
            apare[i] = 0;
            earb[i] = 1;
        }
    }

    void seteaza()
    {
        cdeg = deg;
        cmaxdeg = maxdeg;
        cparent = parent;
        csiz = siz;
        cearb = earb;
        for (auto u : modif)
            apare[u] = false;
        modif.clear();
    }

    void reset()
    {
        //cerr<<"resetez\n"<<modif.size()<<"\n\n";
        for (auto u : modif)
        {
            apare[u] = false;
            parent[u] = cparent[u];
            siz[u] = csiz[u];
            deg[u] = cdeg[u];
            maxdeg[u] = cmaxdeg[u];
            earb[u] = cearb[u];
            //cerr<<" dupa resetare siz "<<u<<" -> "<<siz[u]<<'\n';
        }

        modif.clear();
    }

    int cauta(int u)
    {
        if (u == parent[u])
            return u;
        if (apare[u] == 0) apare[u] = 1, modif.push_back(u);
        return parent[u] = cauta(parent[u]);
    }

    void unite(int u, int v)
    {
        deg[u]++;
        deg[v]++;
        if (apare[u] == 0) apare[u] = 1, modif.push_back(u);
        if (apare[v] == 0) apare[v] = 1, modif.push_back(v);

        int cu = cauta(u);
        int cv = cauta(v);
        maxdeg[cu] = max(maxdeg[cu], (char)min(3, deg[u]));
        maxdeg[cv] = max(maxdeg[cv], (char)min(3, deg[v]));
        u = cu;
        v = cv;
        if (apare[cu] == 0) apare[cu] = 1, modif.push_back(cu);
        if (apare[cv] == 0) apare[cv] = 1, modif.push_back(cv);

        if (u == v)
        {
            earb[u] = false;
            return;
        }

        if (siz[u] > siz[v])
            swap(u, v);
        parent[u] = v;
        siz[v] += siz[u];
        maxdeg[v] = max(maxdeg[v], maxdeg[u]);
        if (earb[u] == false) earb[v] = false;
    }

};

struct muchie
{
    int u, v, c;
};

DSU dsu[bucketsize + 5];
DSU aux;

int n, m;
vector<muchie> muc;
int cntbuc = 0;

void init(int N, int M, std::vector<int> u, std::vector<int> v, std::vector<int> w)
{
    n = N, m = M;
    for (int i = 0; i < m; i++)
    {
        muc.push_back({u[i], v[i], w[i]});
    }

    sort(muc.begin(), muc.end(), [](muchie a, muchie b)
    {
       return a.c < b.c;
    });

    aux.init(n);
    dsu[0] = aux;
    dsu[0].seteaza();
    for (int i = 1; i <= m; i++)
    {
        aux.unite(muc[i - 1].u, muc[i - 1].v);
        if (i % obsize == 0)
        {
            dsu[++cntbuc] = aux;
            dsu[cntbuc].seteaza();
        }
    }
}

int getMinimumFuelCapacity(int uu, int vv)
{
    int fbucket = 0;
    for (int i = 1; i <= cntbuc; i++)
    {
        int u = dsu[i].cauta(uu);
        int v = dsu[i].cauta(vv);
        fbucket = i;
        if (u == v && ((int)dsu[i].maxdeg[u] == 3 || !dsu[i].earb[u]))
        {
            fbucket--;
            break;
        }
    }

    int fmuc = fbucket * bucketsize;
    int lim = min(m, fmuc + bucketsize);
    for (int i = fmuc + 1; i <= lim; i++)
    {
        dsu[fbucket].unite(muc[i - 1].u, muc[i - 1].v);
        //cerr<<muc[i - 1].u<<" "<<muc[i - 1].v<<" -> "<<dsu[fbucket].apare[muc[i - 1].u]<<" "<<dsu[fbucket].apare[muc[i - 1].v]<<" nigger "<<'\n';
        //for (auto it : dsu[fbucket].modif)
             //cerr<<it<<" ";
         //cerr<<'\n';
        int u = dsu[fbucket].cauta(uu);
        int v = dsu[fbucket].cauta(vv);
         //cerr<<"am muchia "<<muc[i - 1].u<<" "<<muc[i - 1].v<<" "<<muc[i - 1].c<<'\n';
         //cerr<<"sunt in nodurile din dsu "<<u<<" "<<v<<'\n';
         //cerr<<" am size "<<dsu[fbucket].siz[u]<<'\n';
         //cerr<<" am maxdeg "<<(int)dsu[fbucket].maxdeg[u]<<'\n';
        if (u == v && ((int)dsu[fbucket].maxdeg[u] == 3 || !dsu[fbucket].earb[u]))
        {
            dsu[fbucket].reset();
             //cerr<<" pica? \n";
             //cerr<<"rezultat: "<<muc[i - 1].c<<'\n';

            return muc[i - 1].c;
        }
    }

    dsu[fbucket].reset();
    return -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...