제출 #628136

#제출 시각아이디문제언어결과실행 시간메모리
628136Cross_Ratio드문 곤충 (IOI22_insects)C++17
100 / 100
62 ms1404 KiB
//#include "insects.h" #include <bits/stdc++.h> using namespace std; map<int,set<int>> MS; void move_inside(int); void move_outside(int); int press_button(); int min_cardinality(int N) { int i, j; set<int> S, S2; vector<int> V; for(i=0;i<N;i++)V.push_back(i); random_shuffle(V.begin(),V.end()); move_inside(V[0]); S.insert(V[0]); int k = 0; int id = -1, v = -1; for(j=1;j<N;j++) { i = V[j]; move_inside(i); S.insert(i); int c = press_button(); if(c >= 2&&j!=N-1) { move_outside(i); S.erase(i); } if(j==N-1) { k = S.size(); if(c>=2) { id = V[N-1]; v = 2; k--; } } } for(i=0;i<N;i++) S2.insert(i); MS[1] = S; int s = 1, e = N/k+1; if(e==s+1) return s; int mid = (s+e)/2; for(int j : S2) { i = V[j]; if(S.find(i)==S.end()) { move_inside(i); S.insert(i); int c = press_button(); if(c>v) { v = c; id = j; } if(c >= mid+1) { move_outside(i); S.erase(i); } if(S.size()==k*mid) break; } if(S.size()==k*mid) break; } MS[mid] = S; while(s+1<e) { int mid = (s+e)/2; if(S.size()==k*mid) { s = mid; if(mid+1>=e) break; mid = (s+e)/2; for(int j : S2) { i = V[j]; if(S.size()==k*mid) break; if(S.find(i)==S.end()) { move_inside(i); S.insert(i); int c = press_button(); if(c>v) { v = c; id = j; } if(c >= mid+1) { move_outside(i); S.erase(i); } if(S.size()==k*mid) break; } if(S.size()==k*mid) break; } MS[mid] = S; } else { e = mid; if(s+1>=e) break; vector<int> era; for(int m : S2) { if(S.find(V[m])==S.end()) era.push_back(m); } for(int i : era) S2.erase(i); S2.erase(id); if(id>=0&&id<N)S.erase(V[id]); mid = (s+e)/2; auto it = MS.upper_bound(mid); it--; set<int> S3 = it->second; set<int> S4; for(i=0;i<N;i++) { if(S3.find(i)!=S3.end()&&S.find(i)==S.end()) { move_inside(i); S.insert(i); } if(S3.find(i)==S3.end()&&S.find(i)!=S.end()) { move_outside(i); S.erase(i); S4.insert(i); } } id = -1; v = -1; for(int i : S4) { if(S.find(i)==S.end()) { move_inside(i); S.insert(i); int c = press_button(); if(c>v) { v = c; id = j; } if(c >= mid+1) { move_outside(i); S.erase(i); } if(S.size()==k*mid) break; } if(S.size()==k*mid) break; } MS[mid] = S; } } return s; }

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

insects.cpp: In function 'int min_cardinality(int)':
insects.cpp:55:24: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   55 |             if(S.size()==k*mid) break;
      |                ~~~~~~~~^~~~~~~
insects.cpp:57:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   57 |         if(S.size()==k*mid) break;
      |            ~~~~~~~~^~~~~~~
insects.cpp:62:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   62 |         if(S.size()==k*mid) {
      |            ~~~~~~~~^~~~~~~
insects.cpp:68:28: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   68 |                 if(S.size()==k*mid) break;
      |                    ~~~~~~~~^~~~~~~
insects.cpp:81:32: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   81 |                     if(S.size()==k*mid) break;
      |                        ~~~~~~~~^~~~~~~
insects.cpp:83:28: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   83 |                 if(S.size()==k*mid) break;
      |                    ~~~~~~~~^~~~~~~
insects.cpp:128:32: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  128 |                     if(S.size()==k*mid) break;
      |                        ~~~~~~~~^~~~~~~
insects.cpp:130:28: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  130 |                 if(S.size()==k*mid) break;
      |                    ~~~~~~~~^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...