Submission #128178

#TimeUsernameProblemLanguageResultExecution timeMemory
128178dndhkMinerals (JOI19_minerals)C++14
40 / 100
23 ms3360 KiB
#include "minerals.h" #include <bits/stdc++.h> #define pb push_back #define all(v) ((v).begin(), (v).end()) #define sortv(v) sort(all(v)) #define sz(v) ((int)(v).size()) #define uniqv(v) (v).erase(unique(all(v)), (v).end()) #define umax(a, b) (a)=max((a), (b)) #define umin(a, b) (a)=min((a), (b)) #define FOR(i,a,b) for(int i = (a); i <= (b); i++) #define rep(i,n) FOR(i,1,n) #define rep0(i,n) FOR(i,0,(int)(n)-1) #define FI first #define SE second #define INF 2000000000 #define INFLL 1000000000000000000LL using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int MAX_N = 43000; int idx[MAX_N*2+1]; vector<pii> ans; bool chk[MAX_N+1]; vector<int> vt1, vt2; int N; deque<pii> dq; void solve(){ /*printf("%d %d\n", x, y); for(int i=x; i<=y; i++){ printf("%d ", idx[i]); if(i==(x+y)/2){ printf("\n"); } } printf("\n");*/ dq.pb({1, 2*N}); int x, y; while(!dq.empty()){ x = dq.front().first; y = dq.front().second; dq.pop_front(); if(y==x+1){ ans.pb({idx[x], idx[y]}); if(chk[x]){ Query(idx[x]); Query(idx[y]); } continue; } int l = (y-x+1)/2; int m = l/2; int i; if(chk[x]){ int prv; i = x+l-1; while(m>0){ prv = Query(idx[i]); i--; m--; } for(int j = y; j >= x+l; j--){ int now = Query(idx[j]); if(now==prv){ Query(idx[j]); vt1.push_back(idx[j]); }else{ vt2.push_back(idx[j]); } prv = now; } }else{ int prv; i = x; while(m>0){ prv = Query(idx[i]); chk[i] = true; m--; i++; } i--; for(int j=x+l; j<=y; j++){ int now = Query(idx[j]); if(now==prv){ vt1.push_back(idx[j]); }else{ Query(idx[j]); vt2.push_back(idx[j]); } } } int i3 = i; int i2 = i+l; i = x+l-1; while(i>i3){ chk[i2] = false; idx[i2] = idx[i]; i--; i2--; } i2 = i + l+1; i = i3+1; while(!vt1.empty()){ chk[i] = true; idx[i] = vt1.back(); vt1.pop_back(); i++; } while(!vt2.empty()){ chk[i2] = false; idx[i2] = vt2.back(); vt2.pop_back(); i2++; } dq.pb({x, i3*2 - x + 1}); dq.pb({i3*2 - x + 2, y}); } } void Solve(int n) { N = n; int prv = 0; int i1 = 1, i2 = N+1; for(int i=1; i<=N*2; i++){ int now = Query(i); if(now==prv){ idx[i2++] = i; }else{ idx[i1++] = i; } prv = now; } for(int i=1; i<=N*2; i++) Query(i); solve(); for(int i=0; i<ans.size(); i++){ Answer(ans[i].first, ans[i].second); } }

Compilation message (stderr)

minerals.cpp: In function 'void Solve(int)':
minerals.cpp:133:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ans.size(); i++){
               ~^~~~~~~~~~~
minerals.cpp: In function 'void solve()':
minerals.cpp:88:5: warning: 'prv' may be used uninitialized in this function [-Wmaybe-uninitialized]
     if(now==prv){
     ^~
minerals.cpp:69:5: warning: 'prv' may be used uninitialized in this function [-Wmaybe-uninitialized]
     if(now==prv){
     ^~
#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...