Submission #908375

#TimeUsernameProblemLanguageResultExecution timeMemory
908375shoryu386Coreputer (IOI23_coreputer)C++17
70 / 100
1 ms364 KiB
#include "coreputer.h" #include <bits/stdc++.h> using namespace std; vector<int> ntwo(){ int res = run_diagnostic({0}); if (res == 1){ return {1, 0}; } else if (res == 0){ int any = run_diagnostic({0, 1}); if (any == 0){ return {0, 0}; } else return {1, 1}; } else return {0, 1}; } vector<int> malfunctioning_cores(int N) { if (N == 2){ return ntwo(); } int firstZero = -1, lastZero = -1; /* for (int m = 0; m < N; m++){ vector<int> bruh; for (int y = 0; y <= m; y++) bruh.push_back(y); int res = run_diagnostic(bruh); cout << res << " "; } cout << "!!!\n"; for (int m = 0; m < N; m++){ vector<int> bruh; for (int y = m; y < N; y++) bruh.push_back(y); int res = run_diagnostic(bruh); cout << res << " "; } cout << "!!!\n"; */ int l = 0, r = N-1; while (l <= r){ int m = (l+r)/2; vector<int> bruh; for (int y = 0; y <= m; y++) bruh.push_back(y); int res = run_diagnostic(bruh); //cerr << m << ' ' << run_diagnostic(bruh) << "???\n" ; if (res == 1){ r = m-1; } else if (res == 0){ r = m-1; firstZero = m; } else{ l = m+1; } } l = 0, r = N-1; while (l <= r){ int m = (l+r)/2; vector<int> bruh; for (int y = m; y < N; y++) bruh.push_back(y); int res = run_diagnostic(bruh); //cerr << m << ' ' << run_diagnostic(bruh) << "???\n" ; if (res == 1){ l = m+1; } else if (res == 0){ l = m+1; lastZero = m; } else{ r = m-1; } } if (firstZero != -1){ //even case //cerr << firstZero << ' ' << lastZero << '\n'; //our malfunctions are at firstZero, and lastZero //we also now know that there are an equal number of malfunctions in the two segments [0, firstZero-1] and [lastZero+2, 15] vector<int> ans(N, 0); ans[firstZero] = 1; ans[lastZero] = 1; for (int x = N-1; x > lastZero; x--){ //include [0, firstZero], include [lastZero+1, 15], except one element vector<int> cur; #define ADDRANGE(a, b) for (int y = a; y <= b; y++) cur.push_back(y); ADDRANGE(0, firstZero); ADDRANGE(x, x); int res = run_diagnostic(cur); //cerr << "\n run: \n"; //for (auto y : cur) cerr << y << ' '; //cerr << '\n'; //cerr << res << '\n'; if (res == 0){ ans[x] = 0; } else ans[x] = 1; } for (int x = 0; x < firstZero; x++){ //include [0, firstZero], exclude [lastZero+1, 15], except one element vector<int> cur; #define ADDRANGE(a, b) for (int y = a; y <= b; y++) cur.push_back(y); ADDRANGE(lastZero, N-1); ADDRANGE(x, x); int res = run_diagnostic(cur); if (res == 0){ ans[x] = 0; } else ans[x] = 1; } return ans; } else{ //lastOne and firstNegOne+1 are now our checkpoints vector<int> ans(N, 0); int lastOne = -1; int l = 0, r = N-1; while (l <= r){ int m = (l+r)/2; vector<int> bruh; for (int y = m; y < N; y++) bruh.push_back(y); int res = run_diagnostic(bruh); //cerr << m << ' ' << run_diagnostic(bruh) << "???\n" ; if (res == 1){ l = m+1; lastOne = m; } else{ r = m-1; } } ans[lastOne] = 1; //cerr << "fixed pt: " << lastOne << '\n'; for (int x = 0; x < lastOne; x++){ //include [0, firstZero], include [lastZero+1, 15], except one element vector<int> cur; #define ADDRANGE(a, b) for (int y = a; y <= b; y++) cur.push_back(y); ADDRANGE(0, lastOne); cur.erase(find(cur.begin(), cur.end(), x)); int res = run_diagnostic(cur); if (res != 1){ ans[x] = 1; } else ans[x] = 0; } for (int x = lastOne+1; x < N; x++){ //include [0, firstZero], include [lastZero+1, 15], except one element vector<int> cur; #define ADDRANGE(a, b) for (int y = a; y <= b; y++) cur.push_back(y); ADDRANGE(lastOne, N-1); cur.erase(find(cur.begin(), cur.end(), x)); int res = run_diagnostic(cur); if (res != 1){ ans[x] = 1; } else ans[x] = 0; } return ans; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...