이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#ifndef LOCAL
#include<insects.h>
#endif
using namespace std;
#ifdef LOCAL
const int MAX = 2e3 + 5;
int N;
int press[MAX];
vector<int> ar;
bool in[MAX];
int cnt[MAX]; //for testcase, use value <= 2000
multiset<int> st;
void move_inside(int i){
++press[0];
if(press[0] > 40000){
cout << "Too much operations move_inside!\n";
assert(false);
}
if(in[i]) {
cout << "Already added!\n";
assert(false);
}
in[i] = true;
if(cnt[ar[i]]) st.erase(st.find(cnt[ar[i]]));
cnt[ar[i]] += 1;
st.insert(cnt[ar[i]]);
}
void move_outside(int i){
++press[1];
if(press[1] > 40000){
cout << "Too much operations move_outside!\n";
assert(false);
}
if(!in[i]){
cout << "Not added yet!\n";
exit(0);
}
in[i] = false;
if(cnt[ar[i]]) st.erase(st.find(cnt[ar[i]]));
cnt[ar[i]] -= 1;
st.insert(cnt[ar[i]]);
}
int press_button(){
++press[2];
if(press[2] > 40000){
cout << "Too much operations press_button!\n";
assert(false);
}
if(st.empty()){
cout << "No insects!\n";
assert(false);
}
return *prev(st.end());
}
#endif
int min_cardinality(int N){
vector<int> inside_insects, outside_insects;
for(int i = 0; i < N; ++i){
move_inside(i);
if(press_button() > 1){
outside_insects.push_back(i);
move_outside(i);
} else inside_insects.push_back(i);
}
if(outside_insects.empty()) return 1;
int distinct_colors = inside_insects.size();
for(int i : inside_insects) move_outside(i);
int l = 2, r = N / distinct_colors, res = 1;
while(l <= r){
int mid = l + r >> 1;
vector<int> keep;
for(int i = 0; i < N; ++i){
move_inside(i);
if(press_button() > mid){
move_outside(i);
} else keep.push_back(i);
}
if(keep.size() == distinct_colors * mid){
res = mid;
l = mid + 1;
} else r = mid - 1;
}
return res;
}
#ifdef LOCAL
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int N = 6;
ar = {5, 8, 9, 5, 9, 9};
cout << min_cardinality(N);
return 0;
}
#endif
컴파일 시 표준 에러 (stderr) 메시지
insects.cpp: In function 'int min_cardinality(int)':
insects.cpp:86:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
86 | int mid = l + r >> 1;
| ~~^~~
insects.cpp:96:24: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
96 | if(keep.size() == distinct_colors * mid){
| ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |