답안 #374637

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
374637 2021-03-07T18:08:08 Z mohamedsobhi777 도서관 (JOI18_library) C++14
0 / 100
2 ms 364 KB
#include <bits/stdc++.h>
#include <vector>
#include "library.h"
using namespace std;
#define vi vector<int>
#define pb push_back
int n;

struct sub
{
       vi a;
       sub(int x)
       {
              a = {x};
       }
       sub() {}
};

vector<sub> ar;

int query(vi x)
{
       vi ret(n, 0);
       for (auto u : x)
              ret[u] = 1;
       return Query(ret);
}

bool belong(sub x, int y)
{
       x.a.pb(y);
       return query(x.a) == 1;
}

bool belong2(sub x, int y)
{
       int z = query(x.a);
       x.a.pb(y);
       return query(x.a) == z;
}

bool direction(sub x, int u)
{
       vi tmp;
       tmp.pb(x.a.back());
       tmp.pb(u);
       return query(tmp) == 1;
}

void merge(sub &x, int y)
{
       if (direction(x, y) == 1)
       {
              x.a.pb(y);
       }
       else
       {
              vi add = {y};
              x.a.insert(x.a.begin(), add.begin(), add.end());
       }
}

int get(int lo, int hi, int i)
{
       int ans = 0;
       while (lo <= hi)
       {
              int mid = (lo + hi) >> 1;

              vi qu(n, 0);
              for (int j = lo; j <= mid; ++j)
              {
                     for (auto u : ar[j].a)
                            qu[u] = 1;
              }
              int ask1 = Query(qu);
              qu[i] = 1;
              if (Query(qu) == ask1)
              {
                     ans = mid;
                     hi = mid - 1;
              }
              else
                     lo = mid + 1;
       }
       return ans;
}

void Solve(int N)
{
       n = N;
       vi tmp(N, 0);
       int comp = 0;
       for (int i = 0; i < N; ++i)
       {
              tmp[i] = 1;
              int y = Query(tmp);
              if (y == comp + 1)
                     ar.pb(sub(i));
              else if (y == comp)
                     merge(ar[get(0, (int)ar.size() - 1, i)], i);
              else
              {

                     int lo = 0, hi = (int)ar.size() - 1;
                     int ans = 0;
                     while (lo <= hi)
                     {
                            int mid = (lo + hi) >> 1;
                            sub lhs, rhs;
                            bool bl = 0, br = 0;
                            for (int j = 0; j < (int)ar.size(); ++j)
                            {
                                   if (j <= mid)
                                          lhs.a.insert(lhs.a.end(), ar[j].a.begin(), ar[j].a.end());
                                   else
                                          rhs.a.insert(rhs.a.end(), ar[j].a.begin(), ar[j].a.end());
                            }
                            bl = belong2(lhs, i);
                            br = belong2(rhs, i);
                            if (bl && br)
                            {
                                   ans = mid;
                                   break;
                            }
                            if (bl)
                                   hi = mid - 1;
                            else
                                   lo = mid + 1;
                     }

                     vi nei = {get(0, ans, i), get(ans + 1, (int)ar.size() - 1, i)};

                     sub ret;
                     if (!direction(ar[nei[0]], i))
                            reverse(ar[nei[0]].a.begin(), ar[nei[0]].a.end());
                     if (direction(ar[nei[1]], i))
                            reverse(ar[nei[1]].a.begin(), ar[nei[1]].a.end());

                     ret.a.insert(ret.a.end(), ar[nei[0]].a.begin(), ar[nei[0]].a.end());
                     ret.a.pb(i);
                     ret.a.insert(ret.a.end(), ar[nei[1]].a.begin(), ar[nei[1]].a.end());

                     vector<sub> nar;
                     for (int j = 0; j < (int)ar.size(); ++j)
                     {
                            if (j == nei[0] || j == nei[1])
                                   continue;
                            nar.pb(ar[j]);
                     }
                     nar.pb(ret);
                     ar = nar;
              }
              comp = y;
       }
       // for (auto u : ar)
       // {
       //        for (auto v : u.a)
       //               cout << ++v << " ";
       //        cout << "\n";
       // }
       // srand(time(0)) ;
       // int arr[1000] ;
       // iota(arr , arr + 1000 , 1) ;
       // random_shuffle(arr , arr + 1000) ;
       // for(int i = 0 ;i < 1000 ;++ i)cout<< arr[i] <<" " ;
       // return ;

       // for(auto u : ar[0].a)cout<< u <<" " ;
       for (auto &u : ar[0].a)
              ++u;
       Answer(ar[0].a);
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 364 KB Execution killed with signal 13
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 364 KB Execution killed with signal 13
2 Halted 0 ms 0 KB -