제출 #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...