Submission #823878

#TimeUsernameProblemLanguageResultExecution timeMemory
823878Kahou도서관 (JOI18_library)C++14
100 / 100
210 ms1076 KiB
#include<bits/stdc++.h>
#include"library.h"
using namespace std;
#define F first
#define S second
#define endl '\n'
#define mk make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1050;
int n;
deque<int> dq[MAXN];

vector<int> get(int k) {
        vector<int> out(n);
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
                if (dq[i].empty()) continue;
                cnt++;
                if (cnt > k) break;
                for (int x:dq[i]) {
                        out[x-1] = 1;
                }
        }
        return out;
}
int getid(int x) {
        for (int i = 1; i <= n; i++) {
                if (dq[i].empty()) continue;
                x--;
                if (!x) return i;
        }
        return 0;
}

void Solve(int N) {
        n = N;
        int t = 1;
        dq[1].push_back(1);
        vector<int> vc(n);
        for (int i = 2; i <= n; i++) {
                vc = get(t);
                vc[i-1] = 1;
                int nt = Query(vc);
                if (nt > t) {
                        dq[i].push_back(i);
                        t++;
                }
                else if (nt == t) {
                        int dw = 0, up = t;
                        while (up-dw > 1) {
                                int md = (up+dw)>>1;
                                vc = get(md);
                                vc[i-1] = 1;
                                if (Query(vc) > md) dw = md;
                                else up = md;
                        }
                        int id = getid(up);
                        bool flg = 0;
                        if (dq[id].size() > 1) {
                                fill(vc.begin(), vc.end(), 0);
                                for (int x:dq[id]) vc[x-1] = 1;
                                vc[i-1] = 1;
                                vc[dq[id].back()-1] = 0;
                                flg = (Query(vc) > 1);
                        }
                        if (flg) dq[id].push_back(i);
                        else dq[id].push_front(i);
                }
                else if (nt < t) {
                        int dw = 0, up = t;
                        while (up-dw > 1) {
                                int md = (up+dw)>>1;
                                vc = get(md);
                                vc[i-1] = 1;
                                if (Query(vc) > md) dw = md;
                                else up = md;
                        }
                        int A = getid(up);
                        dw = 0, up = t;
                        while (up-dw > 1) {
                                int md = (up+dw)>>1;
                                vc = get(md);
                                vc[i-1] = 1;
                                if (Query(vc) >= md) dw = md;
                                else up = md;
                        }
                        int B = getid(up);

                        bool flgA = 0, flgB = 0;
                        if (dq[A].size() > 1) {
                                fill(vc.begin(), vc.end(), 0);
                                for (int x : dq[A]) vc[x-1] = 1;
                                vc[i-1] = 1;
                                vc[dq[A].back()-1] = 0;
                                flgA = (Query(vc) > 1);
                        }
                        if (dq[B].size() > 1) {
                                fill(vc.begin(), vc.end(), 0);
                                for (int x : dq[B]) vc[x-1] = 1;
                                vc[i-1] = 1;
                                vc[dq[B].back()-1] = 0;
                                flgB = (Query(vc) > 1);
                        }

                        if (flgA) dq[A].push_back(i);
                        else dq[A].push_front(i);

                        if (flgB) reverse(dq[B].begin(), dq[B].end());
                        for (int x:dq[B]) {
                                if (flgA) dq[A].push_back(x);
                                else dq[A].push_front(x);
                        }
                        dq[B].clear();
                        t--;
                }
        }

        vector<int> out;
        for (int x:dq[1]) {
                out.push_back(x);
        }
        Answer(out);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...