Submission #915482

#TimeUsernameProblemLanguageResultExecution timeMemory
915482guagua0407Minerals (JOI19_minerals)C++17
85 / 100
31 ms3872 KiB
#include "minerals.h" #include<bits/stdc++.h> using namespace std; #define f first #define s second vector<int> a; vector<int> belong; vector<pair<int,int>> vec; void go(int l,int r,vector<int> &b,int id){ if(l==r){ //Query(a[l]); assert((int)b.size()==1); vec.push_back({a[l],b[0]}); return; } int mid=(l+r)/2; int cur=0; for(int i=l;i<=mid;i++){ cur=Query(a[i]); } vector<int> ls,rs; for(auto v:b){ if(belong[v]<=mid){ ls.push_back(v); continue; } if((int)ls.size()==mid-l+1){ rs.push_back(v); continue; } if((int)rs.size()==r-mid){ ls.push_back(v); continue; } int x=Query(v); if(id==0){ if(x==cur){ ls.push_back(v); } else{ rs.push_back(v); } } else{ if(x!=cur){ ls.push_back(v); } else{ rs.push_back(v); } } cur=x; } vector<int>().swap(b); if(id==0){ go(l,mid,ls,1); go(mid+1,r,rs,0); } else{ go(l,mid,ls,0); go(mid+1,r,rs,1); } } void Solve(int n){ vector<bool> ok(2*n+1); int prv=0; vector<int> ord(2*n+1); for(int i=1;i<=2*n;i++){ ord[i]=i; } mt19937 rng(time(NULL)); shuffle(ord.begin()+1,ord.end(),rng); for(int t=1;t<=2*n;t++){ int i=ord[t]; int x=Query(i); if(x==prv+1){ ok[i]=true; } prv=x; } vector<int> b; int cnt=-1; belong.resize(2*n+1); for(int t=1;t<=2*n;t++){ int i=ord[t]; if(ok[i]){ a.push_back(i); cnt++; } else{ b.push_back(i); belong[i]=cnt; } } go(0,n-1,b,1); for(auto v:vec){ Answer(v.f,v.s); } }
#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...