제출 #944338

#제출 시각아이디문제언어결과실행 시간메모리
944338nguyentunglamMinerals (JOI19_minerals)C++17
100 / 100
38 ms4828 KiB
#include "minerals.h" #include <bits/stdc++.h> using namespace std; const int NN = 1e5 + 10; int f[NN], g[NN], n; void dnc (vector<int> one, vector<int> two, bool toggle) { if (one.size() == 1) { Answer(one[0], two[0]); return; } int sz = g[one.size()], cur = 0; assert(one.size() == two.size()); assert(sz < one.size()); vector<int> one_left, one_right, two_left, two_right; for(int i = 0; i < one.size(); i++) { if (i < sz) one_left.push_back(one[i]); else one_right.push_back(one[i]); } for(int i = 0; i < sz; i++) cur = Query(one[i]); for(int i = 0; i + 1 < two.size(); i++) { int nxt = Query(two[i]); if (cur != nxt) { two_left.push_back(two[i]); cur = nxt; } else two_right.push_back(two[i]); } if (!toggle) swap(two_left, two_right); if (two_left.size() < sz) two_left.push_back(two.back()); else two_right.push_back(two.back()); dnc(one_left, two_left, toggle ^ 1); dnc(one_right, two_right, toggle); } void Solve(int N) { n = N; for(int i = 2; i <= n; i++) { f[i] = 1e9; int l = 1, r = i / 2; auto cost = [&] (int j) { return f[j] + f[i - j] + j + i - 1; }; while (l < r) { int mid = l + r >> 1; if (cost(mid) <= cost(mid + 1)) r = mid; else l = mid + 1; } f[i] = cost(l); g[i] = l; } // for(int i = 2; i <= n; i++) cout << g[i] << endl; // exit(0); int cur = 0; vector<int> one, two; for(int i = 1; i <= 2 * n; i++) { if (Query(i) > cur) { cur++; one.push_back(i); } else two.push_back(i); } dnc(one, two, 1); }

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

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from minerals.cpp:2:
minerals.cpp: In function 'void dnc(std::vector<int>, std::vector<int>, bool)':
minerals.cpp:16:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |   assert(sz < one.size());
      |          ~~~^~~~~~~~~~~~
minerals.cpp:18:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |   for(int i = 0; i < one.size(); i++) {
      |                  ~~^~~~~~~~~~~~
minerals.cpp:23:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |   for(int i = 0; i + 1 < two.size(); i++) {
      |                  ~~~~~~^~~~~~~~~~~~
minerals.cpp:32:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   32 |   if (two_left.size() < sz) two_left.push_back(two.back());
      |       ~~~~~~~~~~~~~~~~^~~~
minerals.cpp: In function 'void Solve(int)':
minerals.cpp:47:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   47 |       int mid = l + r >> 1;
      |                 ~~^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...