제출 #69323

#제출 시각아이디문제언어결과실행 시간메모리
69323E869120Unscrambling a Messy Bug (IOI16_messy)C++14
50 / 100
5 ms640 KiB
#include <vector> #include <string> #include <algorithm> using namespace std; #include "messy.h" // ------------------------------------------ 70 点解法 ------------------------------------- int N, B; string adds(vector<int>p) { string S; for (int i = 0; i < N; i++) S += "0"; for (int i = 0; i < p.size(); i++) S[p[i]] = '1'; return S; } void encode() { // --------------- Step 1. 0 から 6 を区別する for (int i = 0; i < B; i++) add_element(adds(vector<int>{i})); for (int i = 0; i < B - 1; i++) add_element(adds(vector<int>{i, i + 1})); add_element(adds(vector<int>{0, 1, 2})); for (int i = 0; i < B; i++) { for (int j = B; j < N; j++) { if ((j / (1 << i)) % 2 == 0) continue; vector<int>G; for (int k = 0; k < B; k++) { if (k != i) G.push_back(k); } G.push_back(j); add_element(adds(G)); } } } int p[128]; vector<int>X[7], P; bool used[7]; void decode() { vector<int>Z; for (int i = 0; i < N; i++) { if (check_element(adds(vector<int>{i})) == true) Z.push_back(i); } // Z は 7 個ある for (int i = 0; i < B; i++) { for (int j = i + 1; j < B; j++) { if (check_element(adds(vector<int>{Z[i], Z[j]})) == true) { X[i].push_back(j); X[j].push_back(i); } } } int cx = 0; for (int i = 0; i < B; i++) { if (X[i].size() == 1) cx = i; } for (int i = 0; i < B - 1; i++) { used[cx] = true; P.push_back(cx); for (int j = 0; j < X[cx].size(); j++) { if (used[X[cx][j]] == false) { cx = X[cx][j]; break; } } } P.push_back(cx); if (check_element(adds(vector<int>{Z[P[0]], Z[P[1]], Z[P[2]]})) == false) reverse(P.begin(), P.end()); for (int i = 0; i < B; i++) p[Z[P[i]]] = i; // ここからが本質 vector<int>E; for (int i = 0; i < N; i++) { bool OK = false; for (int j = 0; j < Z.size(); j++) { if (i == Z[j]) OK = true; } if (OK == false) E.push_back(i); } for (int i = 0; i < E.size(); i++) { int sum = 0; for (int j = 0; j < B; j++) { vector<int>G; for (int k = 0; k < B; k++) { if (j != k) G.push_back(Z[P[k]]); } G.push_back(E[i]); if (check_element(adds(G)) == true) sum += (1 << j); } p[E[i]] = sum; } } vector<int> restore_permutation(int n, int w, int r) { N = n; for (int i = 0; i <= 7; i++) { if ((1 << i) == n) B = i; } encode(); compile_set(); decode(); vector<int>Z; for (int i = 0; i < N; i++) Z.push_back(p[i]); return Z; }

컴파일 시 표준 에러 (stderr) 메시지

messy.cpp: In function 'std::__cxx11::string adds(std::vector<int>)':
messy.cpp:14:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < p.size(); i++) S[p[i]] = '1';
                  ~~^~~~~~~~~~
messy.cpp: In function 'void decode()':
messy.cpp:49:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < X[cx].size(); j++) { if (used[X[cx][j]] == false) { cx = X[cx][j]; break; } }
                   ~~^~~~~~~~~~~~~~
messy.cpp:60:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < Z.size(); j++) { if (i == Z[j]) OK = true; }
                   ~~^~~~~~~~~~
messy.cpp:64:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < E.size(); i++) {
                  ~~^~~~~~~~~~
#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...