제출 #786887

#제출 시각아이디문제언어결과실행 시간메모리
786887DeepessonMinerals (JOI19_minerals)C++17
25 / 100
10 ms4032 KiB
///#include "minerals.h" #include <bits/stdc++.h> #include <cstdlib> #include <algorithm> //#define DEBUG void Solve(int N); int Query(int x); void Answer(int x, int y); typedef std::pair<int,int> pii; typedef std::pair<int,pii> pip; int mid(pii k){ return (k.first+k.second)/2; } void Solve(int N) { std::vector<int> vec,bads,oopsie; for (int i = 1; i != 2*N+1; ++i) { int x = Query(i); //std::cout<<x<<"<\n"; if(x!=vec.size()){ vec.push_back(i); }else { oopsie.push_back(vec.size()-1); bads.push_back(i); } } std::vector<pip> queries[N]; bool skip[N]={}; for(int i=0;i!=N;++i){ pip range = {bads[i],pii(0,oopsie[i])}; queries[mid(range.second)].push_back(range); } int falta=N; int last=N; int curl=0,curr=N-1; int times=0,c2=0; while(falta){ for(int i=N-1;i!=-1;--i){ if(!falta)break; for(auto&x:queries[i]){ x.second.first=std::max(x.second.first,curl); x.second.second=std::min(x.second.second,curr); if(mid(x.second)!=i){ queries[mid(x.second)].push_back(x); continue; } auto __ = x; int p = -1; if(!skip[i]){ p = Query(x.first);++c2;} ///std::cout<<p<<" "<<i<<"\n"; if(p==last){///Estah contido __.second.second=i; }else { __.second.first=i+1; } if(__.second.first!=__.second.second){ queries[mid(__.second)].push_back(__); //last=Query(x.first); last=p; }else { Answer(x.first,vec[__.second.first]); skip[__.second.first]=1; --falta; last=p; } while(curr>0&&skip[curr])--curr; while(curl<0&&skip[curl])++curl; } if(!skip[i]){ last=Query(vec[i]);++times;} //std::cout<<<<"!\n"; queries[i].clear(); } for(int i=0;i!=N;++i){ if(!falta)break; if(!skip[i]){ last=Query(vec[i]);++times;} for(auto&x:queries[i]){ x.second.first=std::max(x.second.first,curl); x.second.second=std::min(x.second.second,curr); if(mid(x.second)!=i){ queries[mid(x.second)].push_back(x); continue; } auto __ = x; int p = -1; if(!skip[i]){ p = Query(x.first);++c2;} // std::cout<<p<<" "<<i<<"\n"; if(p==last){///Estah contido __.second.second=i; }else { __.second.first=i+1; } if(__.second.first!=__.second.second){ queries[mid(__.second)].push_back(__); //last=Query(x.first); last=p; }else { Answer(x.first,vec[__.second.first]); skip[__.second.first]=1; --falta; last=p; } while(curr>0&&skip[curr])--curr; while(curl<0&&skip[curl])++curl; } queries[i].clear(); } } } #ifdef DEBUG constexpr int MAX_N = 43000; constexpr int MAX_CALLS = 1000000; namespace { void WrongAnswer(int code) { printf("Wrong Answer [%d]\n", code); exit(0); } int N; int counterpart[2 * MAX_N + 1]; int num_queries; int num_kinds; int on[2 * MAX_N + 1]; int count[2 * MAX_N + 1]; int num_answers; int answer[2 * MAX_N + 1]; } // namespace int Query(int x) { if (!(1 <= x && x <= 2 * N)) { WrongAnswer(1); } if (++num_queries > MAX_CALLS) { // WrongAnswer(2); } const int type = std::min(x, counterpart[x]); if (on[x]) { --on[x]; --count[type]; if (count[type] == 0) { --num_kinds; } } else { ++on[x]; ++count[type]; if (count[type] == 1) { ++num_kinds; } } return num_kinds; } void Answer(int a, int b) { std::cout<<"Match "<<a<<" "<<b<<"\n"; if (++num_answers > N) { WrongAnswer(6); } if (!(1 <= a && a <= 2 * N && 1 <= b && b <= 2 * N)) { WrongAnswer(3); } if (answer[a] != 0) { WrongAnswer(4); } answer[a] = b; if (answer[b] != 0) { WrongAnswer(4); } answer[b] = a; if (!(counterpart[a] == b && counterpart[b] == a)) { WrongAnswer(5); } } int main() { if (scanf("%d", &N) != 1) { fprintf(stderr, "Error while reading input\n"); exit(1); } std::vector<int> vec; for(int i=N+1;i!=2*N+1;++i)vec.push_back(i); std::random_shuffle(vec.begin(),vec.end()); std::vector<int> vec2; for(int i=1;i!=N+1;++i)vec2.push_back(i); std::random_shuffle(vec2.begin(),vec2.end()); for (int i = 1; i <= N; ++i) { int x=vec[i-1], y=vec2[i-1]; //if (scanf("%d%d", &x, &y) != 2) { //fprintf(stderr, "Error while reading input\n"); //exit(1); //} //std::cout<<"Create pair "<<x<<" "<<y<<"\n"; counterpart[x] = y; counterpart[y] = x; } Solve(N); if (num_answers != N) { WrongAnswer(6); } printf("Accepted: %d\n", num_queries); return 0; } #endif

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

minerals.cpp: In function 'void Solve(int)':
minerals.cpp:21:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |      if(x!=vec.size()){
      |         ~^~~~~~~~~~~~
minerals.cpp:69:28: warning: array subscript -1 is below array bounds of 'bool [(<anonymous> + 1)]' [-Warray-bounds]
   69 |     while(curl<0&&skip[curl])++curl;
      |                   ~~~~~~~~~^
minerals.cpp:108:28: warning: array subscript -1 is below array bounds of 'bool [(<anonymous> + 1)]' [-Warray-bounds]
  108 |     while(curl<0&&skip[curl])++curl;
      |                   ~~~~~~~~~^
#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...