Submission #48071

#TimeUsernameProblemLanguageResultExecution timeMemory
48071lovemathboyLibrary (JOI18_library)C++14
100 / 100
550 ms844 KiB
#include <bits/stdc++.h> #include "library.h" using namespace std; vector<vector<int> > adj; int n; void recur(vector<int> options, int num) { if ((int)options.size() == 1) { vector<int> m; m.resize(n, 0); m[options[0]] = 1; m[num] = 1; if (Query(m) != 1) return; adj[num].push_back(options[0]); adj[options[0]].push_back(num); return; } vector<int> cur; for (int i = 0; i < options.size()/2; i++) { cur.push_back(options[i]); } vector<int> m; m.resize(n, 0); for (int i = 0; i < cur.size(); i++) m[cur[i]] = 1; int q1 = Query(m); m[num] = 1; int q2 = Query(m); if (q1 == q2) recur(cur, num); else { cur.clear(); for (int i = options.size()/2; i < options.size(); i++) { cur.push_back(options[i]); } recur(cur, num); } } void recur1(vector<int> options, int num) { if ((int)options.size() == 1) { vector<int> m; m.resize(n, 0); m[options[0]] = 1; m[num] = 1; if (Query(m) != 1) return; adj[num].push_back(options[0]); adj[options[0]].push_back(num); return; } vector<int> cur; for (int i = 0; i < options.size()/2; i++) { cur.push_back(options[i]); } vector<int> m; m.resize(n, 0); for (int i = 0; i < cur.size(); i++) m[cur[i]] = 1; int q1 = Query(m); m[num] = 1; int q2 = Query(m); vector<int> temp;// = cur; for (int i = 0; i < cur.size(); i++) temp.push_back(cur[i]); cur.clear(); for (int i = options.size()/2; i < options.size(); i++) { cur.push_back(options[i]); } m.clear(); m.resize(n, 0); for (int i = 0; i < cur.size(); i++) m[cur[i]] = 1; int q3 = Query(m); m[num] = 1; int q4 = Query(m); //printf("%d %d %d %d\n", q1, q2, q3, q4); if (q1 == q2 && q3 == q4) { recur(cur, num); recur(temp, num); } else if (q1 == q2) recur(temp, num); else if (q3 == q4) recur(cur, num); else if (q2 < q1) recur1(temp, num); else if (q4 < q3) recur1(cur, num); else assert(false); } void Solve(int N) { srand(492); n = N; if (n == 1) { vector<int> res; res.resize(1, 1); Answer(res); return; } adj.resize(n); vector<int> options; vector<int> cur; deque<int> ans; vector<bool> vis; vis.resize(n, false); int num = rand()%n; int orig = num; vis[num] = true; for (int i = 0; i < n; i++) { if (!vis[i]) options.push_back(i); } recur1(options, num); //printf("%d\n", adj[num].size()); ans.push_back(num); for (int i = 0; i < adj[orig].size(); i++) { num = orig; int prev = num; num = adj[num][i]; if (i == 0) ans.push_back(num); else ans.push_front(num); vis[num] = true; options.clear(); for (int j = 0; j < n; j++) if (!vis[j]) options.push_back(j); if (options.size() == 0) break; recur(options, num); //printf("%d %d\n", num, adj[num].size()); while (adj[num].size() == 2) { int newprev = num; if (adj[num][0] == prev) num = adj[num][1]; else num = adj[num][0]; if (i == 0) ans.push_back(num); else ans.push_front(num); prev = newprev; vis[num] = true; options.clear(); for (int j = 0; j < n; j++) if (!vis[j]) options.push_back(j); if (options.size() == 0) break; recur(options, num); //printf("%d %d\n", num, adj[num].size()); } } vector<int> res; while (!ans.empty()) { res.push_back(ans.front()+1); ans.pop_front(); } Answer(res); return; }

Compilation message (stderr)

library.cpp: In function 'void recur(std::vector<int>, int)':
library.cpp:20:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < options.size()/2; i++) {
                     ~~^~~~~~~~~~~~~~~~~~
library.cpp:25:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < cur.size(); i++) m[cur[i]] = 1;
                     ~~^~~~~~~~~~~~
library.cpp:32:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = options.size()/2; i < options.size(); i++) {
                                        ~~^~~~~~~~~~~~~~~~
library.cpp: In function 'void recur1(std::vector<int>, int)':
library.cpp:51:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < options.size()/2; i++) {
                     ~~^~~~~~~~~~~~~~~~~~
library.cpp:56:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < cur.size(); i++) m[cur[i]] = 1;
                     ~~^~~~~~~~~~~~
library.cpp:61:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < cur.size(); i++) temp.push_back(cur[i]);
                     ~~^~~~~~~~~~~~
library.cpp:63:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = options.size()/2; i < options.size(); i++) {
                                    ~~^~~~~~~~~~~~~~~~
library.cpp:67:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < cur.size(); i++) m[cur[i]] = 1;
                     ~~^~~~~~~~~~~~
library.cpp: In function 'void Solve(int)':
library.cpp:108:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < adj[orig].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...