Submission #982437

#TimeUsernameProblemLanguageResultExecution timeMemory
982437yhkhooMinerals (JOI19_minerals)C++17
85 / 100
38 ms3976 KiB
#include "minerals.h" #include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; #define pb push_back #define mp make_pair #define fi first #define se second vector<bool> mmm; vector<int> ran; inline int query(int i){ mmm[i] = !mmm[i]; i = ran[i]; return Query(i); } void Solve(int N) { ran.reserve(2*N+1); for(int i=1; i<=2*N; i++){ ran[i] = i; } random_device rd; mt19937 g(rd()); shuffle(ran.begin(), ran.end(), g); mmm.resize(2*N+1); vector<int> x, y, hint(N, N-1); x.reserve(N); y.reserve(N); int pre = 0; for(int i=1; i<=2*N; i++){ int cur = query(i); if(x.size() == N){ y.pb(i); continue; } if(cur == pre){ y.pb(i); //cerr << " y" << i; hint[y.size()-1] = x.size()-1; } else{ x.pb(i); //cerr << " x" << i; } pre = cur; } //cerr << '\n'; map<pii, vector<int>> sex; int prel = 0, prer = N-1; vector<int> l(N, 0), r(N, N-1)/*, m(N, N/2)*/; for(int i=0; i<N; i++){ if(l[i] < r[i]) sex[mp(l[i], r[i])].pb(i); } int orig; while(sex.size()){ /*cerr << '\n'; for(int i=0; i<N; i++){ cerr << i << ' ' << l[i] << ' ' << r[i] << '\n'; } cerr << '\n';*/ auto segp = sex.begin(); auto seg = *segp; auto [cl, cr] = seg.fi; int cm = (cl + cr)/2; for(int i=cl; i<=cm; i++){ if(i < prel || i > prer) orig = query(x[i]); } for(int i=prel; i<=prer; i++){ if(i < cl || i > cm) orig = query(x[i]); } prel = cl; prer = cm; int lc = 0, rc = 0; for(auto i: seg.se){ if(lc == cm-cl+1){ l[i] = cm+1; rc++; } else if(rc == cr-cm){ r[i] = cm; lc++; } else if(hint[i] <= cm){ //cerr << "to the left (hint)"; r[i] = cm; lc++; } else{ //cerr << seg.fi.fi << ' ' << seg.fi.se << ' ' << m << '\n'; //cerr << i << '\n'; int cur = query(y[i]); /*for(int i=1; i<=2*N; i++){ cerr << mmm[i]; }*/ //cerr << '\n'; if(cur == orig){ //cerr << "to the left"; r[i] = cm; lc++; } else{ //cerr << "to the right"; l[i] = cm+1; rc++; } orig = cur; //query(y[i]); //cerr << ".\n"; } if(l[i] < r[i]){ sex[mp(l[i], r[i])].pb(i); } } sex.erase(segp); } /*for(int i=0; i<N; i++){ cerr << y[i] << ' ' << x[l[i]] << '\n'; }*/ for(int i=0; i<N; i++){ Answer(y[i], x[l[i]]); } }

Compilation message (stderr)

minerals.cpp: In function 'void Solve(int)':
minerals.cpp:34:15: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   34 |   if(x.size() == N){
      |      ~~~~~~~~~^~~~
minerals.cpp:98:5: warning: 'orig' may be used uninitialized in this function [-Wmaybe-uninitialized]
   98 |     if(cur == orig){
      |     ^~
#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...