Submission #910087

#TimeUsernameProblemLanguageResultExecution timeMemory
910087guechotjrhhMinerals (JOI19_minerals)C++14
100 / 100
36 ms4900 KiB
#include "minerals.h" #include<vector> #include<set> #include<random> #include<algorithm> #include<iostream> using namespace std; int n, s; //2nlog(2n) random_device rd; mt19937 g(rd()); int szdp = 43000;//getting the szdp bigger, trinary search vector<int> dp0(szdp + 1),nxt0(szdp + 1), dp1(szdp+1), nxt1(szdp+1); void solve(vector<int>& in, vector<int>& rest, int f1) { if (in.size() == 1) { Answer(in[0], rest[0]); return; } vector<int> in1, in2; int sz1 = in.size() / 2; if (in.size() <= szdp) sz1 = in.size() - nxt0[in.size()]; int sz = 0; if (f1) { for (int i = 0; i < sz1; i++) in1.push_back(in[i]); for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]); for (int i : in2) sz = Query(i); } else { sz1 = in.size() - sz1; for (int i = 0; i < sz1; i++) in1.push_back(in[i]); for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]); for (int i : in1) sz = Query(i); } vector<int> rest1, rest2; for (int j : rest) { if (rest1.size() == sz1){ rest2.push_back(j); continue; } if (rest2.size() == rest.size()-sz1) { rest1.push_back(j); continue; } int u = Query(j); if (u == sz) rest1.push_back(j); else { rest2.push_back(j); sz = u; } } solve(in1, rest1, 1); solve(in2, rest2, 0); } void Solve(int N) { dp0[1] = 0; //the xor for (int i = 2; i <= szdp; i++) { int l = 1, r = i / 2, m; while (r > l) { m = (l + r) / 2; int vm = dp0[m] + dp0[i - m] + m + i; int vm1 = dp0[m+1] + dp0[i - m - 1] + m + 1 + i; if (vm > vm1) l = m + 1; else r = m; } dp0[i] = dp0[l] + dp0[i - l] + l + i; nxt0[i] = l; //if (dp1[i] != dp[i]) { cout << i << ' ' << dp[i] << ' ' << dp1[i] << ' ' << "ERROR!!!" << endl; break; } } /*cp0[1] = cp1[1] = 0; for (int i = 2; i <= 10000; i++) { cp0[i] = cp1[i] = 1e9; for (int j = 1; j <= i / 2; j++) { if (cp0[j] + cp1[i - j] + j + i < cp0[i]) { cp0[i] = cp0[j] + cp1[i - j] + j + i; cxt0[i] = j; } if (cp0[j] + cp0[i - j] + 2 * j + i < cp1[i]) { cp1[i] = cp0[j] + cp0[i - j] + 2 * j + i; cxt1[i] = j; } } if (cp0[i] != dp0[i] || cp1[i] != dp1[i]) cout << "ERROR!\n"; }*/ //for (int u = 38000; u <= 43000; u += 1000) cout << u << ' ' << 2 * u + dp0[u] << endl; n = N; s = n << 1; int sz = 0; vector<int> in, rest; vector<int> vec(s); for (int i = 0; i < s; i++)vec[i] = i + 1; //shuffle(vec.begin(), vec.end(), g); for (int i : vec) { if (in.size() < n) { int u = Query(i); if (u > sz) { sz = u; in.push_back(i); } else rest.push_back(i); } else rest.push_back(i); } solve(in, rest, 1); }

Compilation message (stderr)

minerals.cpp: In function 'void solve(std::vector<int>&, std::vector<int>&, int)':
minerals.cpp:21:19: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   21 |     if (in.size() <= szdp) sz1 = in.size() - nxt0[in.size()];
      |         ~~~~~~~~~~^~~~~~~
minerals.cpp:26:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |         for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]);
      |                           ~~^~~~~~~~~~~
minerals.cpp:32:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |         for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]);
      |                           ~~^~~~~~~~~~~
minerals.cpp:37:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   37 |         if (rest1.size() == sz1){ rest2.push_back(j); continue; }
      |             ~~~~~~~~~~~~~^~~~~~
minerals.cpp: In function 'void Solve(int)':
minerals.cpp:91:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   91 |         if (in.size() < n) {
      |             ~~~~~~~~~~^~~
#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...