답안 #374604

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
374604 2021-03-07T14:58:32 Z mohamedsobhi777 도서관 (JOI18_library) C++14
0 / 100
50 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 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)
{
       vi ve = x.a;
       ve.pb(y);
       if (query(ve) == 1)
       {
              x.a.pb(y);
       }
       else
       {
              vi add = {y};
              x.a.insert(x.a.end(), add.begin(), add.end());
       }
}

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)
              {
                     for (auto &u : ar)
                     {
                            if (belong(u, i))
                            {
                                   merge(u, i);
                                   break;
                            }
                     }
              }
              else
              {
                     vi nei;
                     for (int j = 0; j < (int)ar.size(); ++j)
                     {
                            if (belong(ar[j], i))
                            {
                                   nei.pb(j);
                            }
                     }

                     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;
                     // solve2();
              }
              comp = y;
       }
       // for (auto u : ar)
       // {
       //        for (auto v : u.a)
       //               cout << v << " ";
       //        cout << "\n";
       // }
       for (auto &u : ar[0].a)
              ++u;
       Answer(ar[0].a);
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 50 ms 364 KB Wrong Answer [8]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 50 ms 364 KB Wrong Answer [8]
2 Halted 0 ms 0 KB -