답안 #706976

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
706976 2023-03-08T08:14:02 Z socpite CEOI16_icc (CEOI16_icc) C++14
90 / 100
135 ms 624 KB
#include"icc.h"
#include<bits/stdc++.h>
using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

#define f first
#define s second

typedef long long ll;
typedef long double ld;

const int maxn = 105;
const int mod = 998244353;
 
int t, n;

map<int, int> mp;

/*int query(int sza, int szb, int a[], int b[]){
    cout << sza << endl;
    for(int i = 0; i < sza; i++)cout << a[i] << " ";
    cout << endl;
    cout << szb << endl;
    for(int i = 0; i < szb; i++)cout << b[i] << " ";
    cout << endl;
    int x;
    cin >> x;
    return x;
}

void setRoad(int a, int b){
    cout << "FOUND " << a << " " << b << endl;
}*/

int up[maxn];

int Find(int x){
    if(!up[x])return x;
    else return up[x] = Find(up[x]);
}

void Union(int a, int b){
    a = Find(a);
    b = Find(b);
    up[a] = b;
}

int arr1[maxn], arr2[maxn];

int gt(vector<int> a, vector<int> b){
    //cout << a.size() << " " << b.size() << "\n";
    if(a.empty() || b.empty())return 0;
    for(int i = 0; i < a.size(); i++)arr1[i] = a[i];
    for(int i = 0; i < b.size(); i++)arr2[i] = b[i];
    return query(a.size(), b.size(), arr1, arr2);
}

int bs(vector<int> a, vector<int> b){
    int l = 0, r = a.size()-1;
    shuffle(a.begin(), a.end(), rng);
    shuffle(b.begin(), b.end(), rng);
    while(l < r){
        int mid = (l+r+1)>>1;
        if(gt(vector<int>(a.begin(), a.begin()+mid), b))r = mid-1;
        else l = mid;
    }
    return a[l];
}

void findedge(vector<int> a, vector<int> b){
    assert(!a.empty() && !b.empty());
    int h1 = bs(a, b), h2 = bs(b, a);
    Union(h1, h2);
    setRoad(h1, h2);
}

void run(int N){
    n = N;
    for(int i = 0; i < n-1; i++){
        mp.clear();
        int crr = 0;
        vector<int> ord;
        for(int i = 1; i <= n; i++)ord.push_back(i);
        shuffle(ord.begin(), ord.end(), rng);
        for(auto i: ord)if(mp.find(Find(i)) == mp.end())mp[Find(i)] = crr++;
        ord.clear();
        int tot = 0;
        while((1<<tot) < crr-1)tot++;
        for(int j = 0; j <= tot; j++){
            //cout << i << " " << j << endl;
            vector<int> v[2];
            for(int k = 1; k <= n; k++)v[(mp[Find(k)]>>j)&1].push_back(k);
            //cout << v[0].size() << " " << v[1].size() << endl;
            if((j == tot) || gt(v[0], v[1])){
                findedge(v[0], v[1]);
                break;
            }
        }
    }
}

Compilation message

icc.cpp: In function 'int gt(std::vector<int>, std::vector<int>)':
icc.cpp:54:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |     for(int i = 0; i < a.size(); i++)arr1[i] = a[i];
      |                    ~~^~~~~~~~~~
icc.cpp:55:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for(int i = 0; i < b.size(); i++)arr2[i] = b[i];
      |                    ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 468 KB Ok! 101 queries used.
2 Correct 4 ms 468 KB Ok! 99 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 500 KB Ok! 528 queries used.
2 Correct 37 ms 488 KB Ok! 659 queries used.
3 Correct 39 ms 488 KB Ok! 659 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 120 ms 500 KB Ok! 1391 queries used.
2 Correct 127 ms 500 KB Ok! 1613 queries used.
3 Correct 106 ms 500 KB Ok! 1477 queries used.
4 Correct 114 ms 512 KB Ok! 1520 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 122 ms 508 KB Ok! 1509 queries used.
2 Correct 124 ms 512 KB Ok! 1494 queries used.
3 Correct 129 ms 588 KB Ok! 1612 queries used.
4 Correct 110 ms 512 KB Ok! 1463 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 135 ms 512 KB Ok! 1608 queries used.
2 Correct 124 ms 496 KB Ok! 1602 queries used.
3 Correct 123 ms 512 KB Ok! 1617 queries used.
4 Correct 116 ms 512 KB Ok! 1590 queries used.
5 Correct 117 ms 496 KB Ok! 1500 queries used.
6 Correct 120 ms 624 KB Ok! 1540 queries used.
# 결과 실행 시간 메모리 Grader output
1 Incorrect 132 ms 508 KB Too many queries! 1626 out of 1625
2 Halted 0 ms 0 KB -