제출 #1349255

#제출 시각아이디문제언어결과실행 시간메모리
1349255AndreyVoltage 2 (JOI26_voltage)C++20
100 / 100
31 ms948 KiB
#include "voltage.h"
#include<bits/stdc++.h>
using namespace std;

int n;
int m;
vector<int> wut(0);
vector<int> banana[2000];
vector<pair<int,int>> ans(0);

int compare(int a, int b) {
    vector<int> x(n);
    vector<int> y(n);
    for(int v: wut) {
        x[v] = 1;
        y[v] = 1;
    }
    x[a] = 1;
    y[b] = 1;
    return query(x,y);
}

void dudesort(vector<int>& haha) {
    if(haha.size() <= 1) {
        return;
    }
    int k = haha.size();
    vector<int> a(0);
    vector<int> b(0);
    for(int i = 0; i < k/2; i++) {
        a.push_back(haha[i]);
    }
    for(int i = k/2; i < k; i++) {
        b.push_back(haha[i]);
    }
    dudesort(a);
    dudesort(b);
    int y1 = 0,y2 = 0;
    for(int i = 0; i < k; i++) {
        if(y1 == a.size()) {
            haha[i] = b[y2];
            y2++;
        }
        else if(y2 == b.size()) {
            haha[i] = a[y1];
            y1++;
        }
        else {
            if(compare(a[y1],b[y2]) == 1) {
                haha[i] = a[y1];
                y1++;
            }
            else {
                haha[i] = b[y2];
                y2++;
            }
        }
    }
}

void troll(int p) {
    for(int i = p+1; i <= n; i++) {
        for(int v: banana[i]) {
            banana[i-1].push_back(v);
        }
        banana[i].clear();
    }
}

void upd(int x) {
    int p = -1;
    for(int i = 0; i <= n; i++) {
        for(int v: banana[i]) {
            if(v == x) {
                p = i;
            }
        }
    }
    vector<int> idk(0);
    for(int v: banana[p]) {
        if(v != x) {
            idk.push_back(v);
        }
    }
    banana[p] = idk;
    if(banana[p].empty()) {
        troll(p);
    }
    if(p == 0 || compare(banana[p-1][0],x) != 0) {
        for(int i = n; i >= p+1; i--) {
            for(int v: banana[i-1]) {
                banana[i].push_back(v);
            }
            banana[i-1].clear();
        }
        banana[p].push_back(x);
    }
    else {
        banana[p-1].push_back(x);
    }
}

bool solve(int N, int M) {
    n = N;
    m = M;
    vector<int> haha(0);
    for(int i = 0; i < n; i++) {
        haha.push_back(i);
    }
    dudesort(haha);
    int y = 0;
    for(int i = 0; i < n; i++) {
        if(i > 0 && compare(haha[i],haha[i-1]) != 0) {
            y++;
        }
        banana[y].push_back(haha[i]);
    }
    for(int i = 0; i < n; i++) {
        vector<int> x(n);
        vector<int> y(n);
        int c = banana[0][banana[0].size()-1];
        banana[0].pop_back();
        if(banana[0].empty()) {
            troll(0);
        }
        for(int v: wut) {
            x[v] = 1;
        }
        x[c] = 1;
        if(query(x,y) != 0) {
            return false;
        }
        vector<int> wow(0);
        for(int j = 0; j <= n; j++) {
            for(int v: banana[j]) {
                wow.push_back(v);
            }
        }
        int t = 0;
        vector<int> q(0);
        while(t < wow.size()) {
            for(int i = 0; i < n; i++) {
                x[i] = 0;
                y[i] = 0;
            }
            int l = t,r = wow.size()-1;
            for(int v: wut) {
                y[v] = 1;
                x[v] = 1;
            }
            for(int i = 0; i < t; i++) {
                y[wow[i]] = 1;
            }
            for(int i = 0; i < wow.size(); i++) {
                x[wow[i]] = 1;
            }
            if(query(x,y) == 0) {
                break;
            }
            while(l < r) {
                int mid = (l+r)/2;
                x = y;
                for(int j = 0; j <= mid; j++) {
                    x[wow[j]] = 1;
                }
                if(query(x,y) == 0) {
                    l = mid+1;
                }
                else {
                    r = mid;
                }
            }
            q.push_back(wow[l]);
            ans.push_back({wow[l],c});
            t = l+1;
        }
        wut.push_back(c);
        for(int v: q) {
            upd(v);
        }
    }
    for(int i = 0; i < ans.size(); i++) {
        answer(ans[i].first,ans[i].second);
    }
    return true;
}
#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...