제출 #604484

#제출 시각아이디문제언어결과실행 시간메모리
604484SeDunionICC (CEOI16_icc)C++17
컴파일 에러
0 ms0 KiB
#include<algorithm> #include<iostream> #include<vector> #ifndef LOCAL #include<icc.h> #endif using namespace std; const int N = 103; int p[N]; int get(int x) { if (x == p[x]) return x; return p[x] = get(p[x]); } int A[N], B[N]; int rx[N], ry[N], rr; int road[N][N]; #ifndef LOCAL void setRoad(int a, int b) { ++rr; cout << "New road " << rx[rr] << " " << ry[rr] << endl; road[rx[rr]][ry[rr]] = road[ry[rr]][rx[rr]] = 1; } #endif int query(vector<int>&X, vector<int>&Y) { #ifndef LOCAL cout << "Q: "; for (int i : X) cout << i << " "; cout << "\n "; for (int i : Y) cout << i << " "; cout << endl; for (int i : X) for (int j : Y) { if (road[i][j]) { cout << "TRUE\n"; return 1; } } cout << "FALSE\n"; return 0; #else for (int i = 0 ; i < (int)X.size() ; ++ i) A[i] = X[i]; for (int i = 0 ; i < (int)Y.size() ; ++ i) B[i] = Y[i]; return query(X.size(), Y.size(), A, B); #endif } void run(int N) { for (int i = 1 ; i <= N ; ++ i) p[i] = i; for (int rep = 0 ; rep < N - 1 ; ++ rep) { vector<int>cur; for (int i = 1 ; i <= N ; ++ i) cur.emplace_back(get(i)); sort(cur.begin(), cur.end()); cur.resize(unique(cur.begin(), cur.end()) - cur.begin()); int m = cur.size(); int diff = 0; #ifndef LOCAL cout << "cur "; for (int i : cur) cout << i << " "; cout << endl; #endif for (int b = 0 ; b < 10 ; ++ b) { vector<int>A, B; for (int i = 0 ; i < m ; ++ i) { if (i >> b & 1) A.emplace_back(cur[i]); else B.emplace_back(cur[i]); } if (A.empty() || B.empty()) continue; for (int i = 1 ; i <= N ; ++ i) { if (count(A.begin(), A.end(), i) == 0 && count(A.begin(), A.end(), get(i)) == 1) { A.emplace_back(i); } if (count(B.begin(), B.end(), i) == 0 && count(B.begin(), B.end(), get(i)) == 1) { B.emplace_back(i); } } int x = query(A, B); if (x) diff |= 1 << b; } #ifndef LOCAL cout << "diff " << diff << endl; #endif vector<pair<int,int>>can; for (int i = 0 ; i < m ; ++ i) { int x = cur[i]; int j = (i ^ diff); if (0 <= j && j < m); else continue; int y = cur[j]; if (1 <= y && y <= N) { bool has = false; for (auto [a, b] : can) { if (a == x && b == y) has = true; if (a == y && b == x) has = true; } if (has) continue; for (int i = 1 ; i <= N ; ++ i) { for (int j = 1 ; j <= N ; ++ j) { if (get(i) == x && get(j) == y) { can.emplace_back(i, j); } } } } } int l = 0, r = (int)can.size() - 1; while (l < r) { int mid = (l + r) >> 1; vector<int>A, B; for (int i = 0 ; i <= mid ; ++ i) { A.emplace_back(can[i].first); B.emplace_back(can[i].second); } int x = query(A, B); if (x) r = mid; else l = mid + 1; } int x = can[r].first; int y = can[r].second; #ifndef LOCAL cout << "GUESS ROAD " << x << " " << y << endl; #endif p[get(x)] = get(y); setRoad(x, y); /* vector<int>X, Y; for (int i = 1 ; i <= N ; ++ i) { if (get(i) == x) X.emplace_back(i); if (get(i) == y) Y.emplace_back(i); } int lx = 0, rx = (int)X.size() - 1; while (lx < rx) { int mid = (lx + rx) >> 1; vector<int>A, B = Y; for (int i = 0 ; i <= mid ; ++ i) { A.emplace_back(X[i]); } int x = query(A, B); if (x) rx = mid; else lx = mid + 1; } int ly = 0, ry = (int)Y.size() - 1; while (ly < ry) { int mid = (ly + ry) >> 1; vector<int>A = X, B; for (int i = 0 ; i <= mid ; ++ i) { B.emplace_back(Y[i]); } int x = query(A, B); if (x) ry = mid; else ly = mid + 1; } int a = X[rx]; int b = Y[ry]; cout << "GUESS ROAD " << a << " " << b << endl; p[get(a)] = get(b); setRoad(a, b); */ } } #ifndef LOCAL int main() { int n; cin >> n; for (int rep = 0 ; rep < n - 1 ; ++ rep) { cin >> rx[rep] >> ry[rep]; } road[rx[0]][ry[0]] = road[ry[0]][rx[0]] = 1; run(n); } #endif

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

/usr/bin/ld: /tmp/cc1ItESk.o: in function `setRoad':
grader.cpp:(.text+0x1de0): multiple definition of `setRoad'; /tmp/ccZo0y0l.o:icc.cpp:(.text+0x420): first defined here
/usr/bin/ld: /tmp/cc1ItESk.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccZo0y0l.o:icc.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status