답안 #718029

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
718029 2023-04-03T07:54:13 Z stevancv CEOI16_icc (CEOI16_icc) C++14
61 / 100
162 ms 624 KB
#include <bits/stdc++.h>
#include "icc.h"
#define ll long long
#define ld long double
#define sp ' '
#define en '\n'
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
using namespace std;
const int N = 100 + 2;
const int inf = 1e9;
vector<int> svi[N];
int aaa[N], bbb[N];
int Query(vector<int> a, vector<int> b) {
    int A = a.size(); int B = b.size();
    for (int i = 0; i < A; i++) aaa[i] = a[i];
    for (int i = 0; i < B; i++) bbb[i] = b[i];
    return query(A, B, aaa, bbb);
}
int gazda[N];
void run(int n) {
    vector<int> v;
    for (int i = 1; i <= n; i++) {
        svi[i].push_back(i);
        gazda[i] = i;
    }
    auto Sredi = [&] (vector<int> v) {
        vector<int> ret;
        for (int i = 0; i < v.size(); i++) {
            for (int j : svi[v[i]]) ret.push_back(j);
        }
        return ret;
    };
    for (int zz = 0; zz < n - 1; zz++) {
        vector<int> v;
        for (int i = 1; i <= n; i++) {
            if (gazda[i] == i) v.push_back(i);
        }
        int sz = v.size();
        vector<int> a, b;
        while (1) {
            random_shuffle(v.begin(), v.end());
            for (int i = 0; i < sz / 2; i++) a.push_back(v[i]);
            for (int i = sz / 2; i < sz; i++) b.push_back(v[i]);
            auto aa = Sredi(a); auto bb = Sredi(b);
            if (Query(aa, bb) == 1) break;
            else {a.clear(); b.clear();}
        }
        a = Sredi(a); b = Sredi(b);
      	assert(a.size() + b.size() == n);
       	int l = 0, r = a.size() - 2, inda = a.back();
        while (l <= r) {
            int mid = l + r >> 1;
            vector<int> tr;
            for (int i = 0; i <= mid; i++) tr.push_back(a[i]);
            if (Query(tr, b) == 1) {
                inda = a[mid];
                r = mid - 1;
            }
            else l = mid + 1;
        }
        l = 0, r = b.size() - 2;
        int indb = b.back();
        while (l <= r) {
            int mid = l + r >> 1;
            vector<int> tr;
            for (int i = 0; i <= mid; i++) tr.push_back(b[i]);
            if (Query({inda}, tr) == 1) {
                indb = b[mid];
                r = mid - 1;
            }
            else l = mid + 1;
        }
        setRoad(inda, indb);
        while (gazda[inda] != inda) inda = gazda[inda];
        while (gazda[indb] != indb) indb = gazda[indb];
        for (int i : svi[indb]) {
            svi[inda].push_back(i);
            gazda[i] = inda;
        }
        svi[indb].clear();
    }
}

Compilation message

icc.cpp: In lambda function:
icc.cpp:29:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |         for (int i = 0; i < v.size(); i++) {
      |                         ~~^~~~~~~~~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from icc.cpp:1:
icc.cpp: In function 'void run(int)':
icc.cpp:50:35: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   50 |        assert(a.size() + b.size() == n);
      |               ~~~~~~~~~~~~~~~~~~~~^~~~
icc.cpp:53:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   53 |             int mid = l + r >> 1;
      |                       ~~^~~
icc.cpp:65:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |             int mid = l + r >> 1;
      |                       ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 496 KB Ok! 111 queries used.
2 Correct 5 ms 468 KB Ok! 103 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 504 KB Ok! 552 queries used.
2 Correct 43 ms 496 KB Ok! 861 queries used.
3 Correct 41 ms 496 KB Ok! 807 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 468 KB Ok! 1516 queries used.
2 Correct 162 ms 480 KB Ok! 2163 queries used.
3 Correct 124 ms 612 KB Ok! 1741 queries used.
4 Correct 126 ms 496 KB Ok! 1709 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 125 ms 480 KB Ok! 1665 queries used.
2 Correct 120 ms 600 KB Ok! 1634 queries used.
3 Correct 134 ms 612 KB Ok! 1865 queries used.
4 Correct 115 ms 496 KB Ok! 1644 queries used.
# 결과 실행 시간 메모리 Grader output
1 Incorrect 132 ms 624 KB Too many queries! 1827 out of 1775
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 143 ms 492 KB Too many queries! 1858 out of 1625
2 Halted 0 ms 0 KB -