제출 #1333359

#제출 시각아이디문제언어결과실행 시간메모리
1333359horiaboeriuCave (IOI13_cave)C++20
100 / 100
423 ms532 KiB
#include <bits/stdc++.h>
#include "cave.h"
using namespace std;
const int MAXN = 5000;
int s[MAXN], v[MAXN], d[MAXN];
void exploreCave(int n) {
    int i, j, x, rez, st, dr, mij, nr;
    //O(n^2 * log(n))
    //o sa o fac din N * logN + N cred adica <= 70 de mii
    //ca mai intai pentru usa i voi face un query ca sa vad daca trebuie sa fie in sus sau in joc s2withcul ca sa se deschida
    //si dupa tot injumatatesc candidatii ca pe primii ii pun in jos si pe restul in sus deci din log queryuri aflu care switch este la acea usa
    for (i = 0; i < n; i++) {
        d[i] = -1;//nu stiu inca ce usa are
    }
    for (i = 0; i < n; i++) {
        //le testez normal pe cele de la 0 la i - 1 cat sa se deschida si le pun 1 la restul, insemnand ca e in jos switchul
        for (j = 0; j < n; j++) {
            v[j] = s[j];
            if (d[j] < 0) {
                v[j] = 1;//in jos
            }
        }
        x = tryCombination(v);
        rez = 0;
        if (x != i) {
            rez = 1;//este in jos maneta
        }
        st = 0;
        dr = n - i;
        while (dr - st > 1) {
            mij = (st + dr) / 2;
            //primele mij sunt cu rez si ultimele cu rez ^ 1
            nr = mij;
            for (j = 0; j < n; j++) {
                v[j] = s[j];
                if (d[j] < 0) {
                    if (nr > 0) {
                        v[j] = rez;
                        nr--;
                    } else {
                        v[j] = (rez ^ 1);
                    }
                }
            }
            x = tryCombination(v);
            if (x == i) {
                st = mij;//am incercat prea putine switchuri din prefix cu rez
            } else {
                dr = mij;
            }
        }
        //il caut pe al dr-lea
        j = 0;
        while (dr > 0) {
            if (d[j] < 0) {
                dr--;
            }
            j++;
        }
        j--;//acesta este switchul
        d[j] = i;
        s[j] = rez;
    }
    answer(s, d);
}
#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...