제출 #1246683

#제출 시각아이디문제언어결과실행 시간메모리
1246683CyberCowSphinx's Riddle (IOI24_sphinx)C++20
1.50 / 100
217 ms1160 KiB
#include "sphinx.h" #include <bits/stdc++.h> using namespace std; vector<int> v[300]; int p[300], sz[300]; int p1[300], sz1[300]; int qan = 0, QAQ = 0; // void make_set1(int i) { p1[i] = i; sz1[i] = 1; QAQ++; } int get_papa1(int i) { if(p1[i] == i)return i; return p1[i] = get_papa1(p1[i]); } void union_set1(int a, int b) { a = get_papa1(a); b = get_papa1(b); if(a == b)return; if(sz1[a] > sz1[b])swap(a, b); p1[a] = b; sz1[b] += sz1[a]; QAQ--; } // void make_set(int i) { p[i] = i; sz[i] = 1; qan++; } int get_papa(int i) { if(p[i] == i)return i; return p[i] = get_papa(p[i]); } void union_set(int a, int b) { a = get_papa(a); b = get_papa(b); if(a == b)return; if(sz[a] > sz[b])swap(a, b); p[a] = b; sz[b] += sz[a]; qan--; } int NN; vector<int> XX, YY; int perform_experimentQ(vector<int> &a) { int x = perform_experiment(a); qan = 0; for (int i = 0; i < a.size(); i++) { if(a[i] == NN) { make_set(i); } } for (int i = 0; i < XX.size(); i++) { if(a[XX[i]] == NN && a[YY[i]] == NN) { union_set(XX[i], YY[i]); } } return x - qan; } vector<int> find_colours(int N, vector<int> X, vector<int> Y) { XX = X; YY = Y; NN = N; // if(N <= 50) // { // vector<int> G(N, 0); // vector<int> E(N, N); // for (int i = 0; i < X.size(); i++) // { // v[X[i]].push_back(Y[i]); // v[Y[i]].push_back(X[i]); // } // for (int i = 0; i < N; i++) // { // E[i] = 0; // E[v[i][0]] = 0; // int x = perform_experiment(E); // for (int j = 0; j < N; j++) // { // E[i] = -1; // E[v[i][0]] = j; // int y = perform_experiment(E); // if(x == y) // { // G[i] = j; // break;; // } // } // E[i] = N; // E[v[i][0]] = N; // } // return G; // } vector<int> harc(N, N); vector<int> bi; for (int i = 0; i < N; i++) { make_set1(i); } int ne = 1; vector<int> ans; for (int i = 1; i < N; i++) { while (1) { vector<int> inchakatarvum(N, -1); for (int j = 0; j < N; j++) { if(i < j || (get_papa1(j) == get_papa1(i))) inchakatarvum[j] = N; } int xx = perform_experimentQ(inchakatarvum); inchakatarvum[i] = -1; int yy = perform_experimentQ(inchakatarvum); if(xx != yy)break; int l = 0, r = i - 1, anss = -1; while(l <= r) { int m = (l + r) / 2; vector<int> blblb(N, N); for (int j = 0; j <= m; j++) { if(get_papa1(j) != get_papa1(i)) blblb[j] = -1; } int x = perform_experimentQ(blblb); blblb[i] = -1; int y = perform_experimentQ(blblb); if(x == y) { anss= m; r = m - 1; } else l = m + 1; } while (get_papa1(anss) == get_papa1(i)) { anss++; } union_set1(i, anss); } } for (int i = 0; i < N; i++) { ans.push_back(get_papa1(i)); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...