Submission #950999

#TimeUsernameProblemLanguageResultExecution timeMemory
950999GrandTiger1729Toxic Gene (NOI23_toxic)C++17
93.25 / 100
76 ms1492 KiB
#include "toxic.h" #include <bits/stdc++.h> using namespace std; const int K = 8, T = 30; vector<int> encode(vector<int> qry) { int n = qry.size(); vector<int> ret; for (int i = 0; i < n; i++) { for (int j = 0; j < (1 << i); j++) { ret.push_back(qry[i]); } } return ret; } void determine_type(int n) { vector<int> ord(n); iota(ord.begin(), ord.end(), 1); srand(mt19937(time(0))()); mt19937 randint(time(0)); random_shuffle(ord.begin(), ord.end()); string ans(n + 1, 'R'); int cnt = 0; int tt = -1; vector<int> stk; int i = 0; while (cnt < T && i < n) { int j = min(n, i + K); int xx = -1; { vector<int> qry; for (int k = i; k < j; k++) { qry.push_back(ord[k]); } int x = min(stk.size(), K - qry.size()); for (int k = 0; k < x; k++) { qry.push_back(stk.end()[-1 - k]); } xx = query_sample(encode(qry)); if (xx == (1 << qry.size()) - 1) { stk.insert(stk.end(), qry.begin(), qry.end()); i = j; continue; } else { for (int k = j - i; k < qry.size(); k++) { ans[qry[k]] = (xx >> k & 1) ? 'S' : 'R'; } for (int k = 0; k < x; k++) { stk.pop_back(); } } } auto make_query = [&](int mid) { vector<int> qry; for (int k = i; k < mid; k++) { qry.push_back(ord[k]); } int x = min(stk.size(), K - qry.size()); for (int k = 0; k < x; k++) { qry.push_back(stk.end()[-1 - k]); } return qry; }; int l = i, r = j; while (l < r - 1) { int mid = (l + r) / 2; vector<int> qry = make_query(mid); int res = query_sample(encode(qry)); if (res == (1 << qry.size()) - 1) { l = mid; } else { int x = qry.size() - (mid - i); for (int k = mid - i; k < qry.size(); k++) { ans[qry[k]] = (res >> k & 1) ? 'S' : 'R'; } for (int k = 0; k < x; k++) { stk.pop_back(); } r = mid; } } vector<int> qry = make_query(l); for (int k = 0; k < l - i; k++) { ans[qry[k]] = (xx >> k & 1) ? 'S' : 'R'; } cerr << "ans " << ans << endl; ans[ord[l]] = 'T'; cerr << "OK " << l << ' ' << ord[l] << endl; i = l + 1; tt = ord[l]; cnt++; } while (i < n) { stk.push_back(ord[i++]); } cerr << ans << endl; for (int j = 0; j < stk.size(); j++) { cerr << stk[j] << endl; } cerr << "tt " << tt << endl; while (stk.size()) { int x = min((int)stk.size(), K); vector<int> qry; for (int k = 0; k < x; k++) { qry.push_back(stk.back()); stk.pop_back(); } auto tmp = encode(qry); tmp.push_back(tt); int res = query_sample(tmp); for (int k = 0; k < (int)qry.size(); k++) { ans[qry[k]] = (res >> k & 1) ? 'S' : 'R'; } } cerr << ans << endl; for (int j = 1; j <= n; j++) { answer_type(j, ans[j]); } }

Compilation message (stderr)

toxic.cpp: In function 'void determine_type(int)':
toxic.cpp:55:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for (int k = j - i; k < qry.size(); k++)
      |                         ~~^~~~~~~~~~~~
toxic.cpp:92:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |     for (int k = mid - i; k < qry.size(); k++)
      |                           ~~^~~~~~~~~~~~
toxic.cpp:120:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |  for (int j = 0; j < stk.size(); j++)
      |                  ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...