제출 #1271851

#제출 시각아이디문제언어결과실행 시간메모리
1271851VMaksimoski008ICC (CEOI16_icc)C++20
컴파일 에러
0 ms0 KiB
#include "icc.h"
#include <bits/stdc++.h>
using namespace std;

struct union_find {
    int n;
    vector<int> par, size;
    vector<vector<int> > st;

    union_find(int _n) : n(_n), par(n+1), size(n+1, 1), st(n+1) {
        for(int i=1; i<=n; i++) {
            par[i] = i;
            st[i].push_back(i);
        }
    }

    int find(int u) {
        if(u == par[u]) return u;
        return par[u] = find(par[u]);
    }

    void uni(int a, int b) {
        a = find(a); b = find(b);
        if(a == b) return ;
        if(size[a] < size[b]) swap(a, b);
        for(int &u : st[b]) st[a].push_back(b);
        size[a] += size[b];
        par[b] = a;
    }

    bool same_set(int a, int b) {
        return find(a) == find(b);
    }
} dsu(105);

int _query(vector<int> &a, vector<int> &b) {
    vector<int> x, y;
    for(int u : a)
        for(int v : dsu.st[u])
            x.push_back(v);
    for(int u : b)
        for(int v : dsu.st[u])
            y.push_back(v);
    return query(x.size(), y.size(), x, y);
}

void run(int n) {
    //ICC = Egoi25 Dark Ride

    for(int _=1; _<n; _++) {
        vector<int> babi;
        for(int i=1; i<=n; i++)
            if(dsu.find(i) == i) babi.push_back(i);

        int XOR = 0, bit = -1;
        for(int b=0; (1<<b)<=n; b++) {
            vector<int> v1, v2;
            for(int u : babi) {
                if(u & (1 << b)) v1.push_back(u);
                else v2.push_back(u);
            }

            if(_query(v1, v2)) {
                XOR ^= (1 << b);
                bit = b;
            }
        }

        vector<int> v1, v2;
        for(int u : babi) {
            if(u & (1 << bit)) {
                v1.push_back(u);
            } else {
                v2.push_back(u);
            }
        }

        int l=0, r=v1.size()-1, p=0;
        while(l <= r) {
            int m = (l + r) / 2;
            vector<int> v3;
            for(int i=0; i<=m; i++)
                v3.push_back(v1[i]);

            if(_query(v3, v2)) p = m, r = m - 1;
            else l = m + 1;
        }

        int pu = v1[p];
        int pv = pu ^ XOR;

        int u = 0;
        l=0, r=dsu.st[pu].size()-1;
        while(l <= r) {
            int m = (l + r) / 2;
            vector<int> v3;
            for(int i=0; i<=m; i++)
                v3.push_back(dsu.st[pu][i]);
            
            if(query(v3.size(), dsu.st[pv].size(), v3, dsu.st[pv]))
                u = dsu.st[pu][m], r = m - 1;
            else
                l = m + 1;
        }

        int v = 0;
        l=0, r=dsu.st[pv].size()-1;
        while(l <= r) {
            int m = (l + r) / 2;
            vector<int> v3;
            for(int i=0; i<=m; i++)
                v3.push_back(dsu.st[pv][i]);

            if(query(v3.size(), dsu.st[pu].size(), v3, dsu.st[pu]))
                v = dsu.st[pv][m], r = m - 1;
            else
                l = m + 1;
        }
        setRoad(u, v);
        dsu.uni(u, v);
    }
}

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

icc.cpp: In function 'int _query(std::vector<int>&, std::vector<int>&)':
icc.cpp:44:38: error: cannot convert 'std::vector<int>' to 'int*'
   44 |     return query(x.size(), y.size(), x, y);
      |                                      ^
      |                                      |
      |                                      std::vector<int>
In file included from icc.cpp:1:
icc.h:10:30: note:   initializing argument 3 of 'int query(int, int, int*, int*)'
   10 | int query(int a, int b, int *A, int *B);
      |                         ~~~~~^
icc.cpp: In function 'void run(int)':
icc.cpp:100:52: error: cannot convert 'std::vector<int>' to 'int*'
  100 |             if(query(v3.size(), dsu.st[pv].size(), v3, dsu.st[pv]))
      |                                                    ^~
      |                                                    |
      |                                                    std::vector<int>
icc.h:10:30: note:   initializing argument 3 of 'int query(int, int, int*, int*)'
   10 | int query(int a, int b, int *A, int *B);
      |                         ~~~~~^
icc.cpp:114:52: error: cannot convert 'std::vector<int>' to 'int*'
  114 |             if(query(v3.size(), dsu.st[pu].size(), v3, dsu.st[pu]))
      |                                                    ^~
      |                                                    |
      |                                                    std::vector<int>
icc.h:10:30: note:   initializing argument 3 of 'int query(int, int, int*, int*)'
   10 | int query(int a, int b, int *A, int *B);
      |                         ~~~~~^