제출 #581693

#제출 시각아이디문제언어결과실행 시간메모리
581693tranxuanbach동굴 (IOI13_cave)C++17
51 / 100
632 ms62412 KiB
#ifndef FEXT #include "cave.h" #endif #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define endl '\n' #define fi first #define se second #define For(i, l, r) for (auto i = l; i < r; i++) #define ForE(i, l, r) for (auto i = l; i <= r; i++) #define FordE(i, l, r) for (auto i = l; i >= r; i--) #define Fora(v, a) for (auto v: a) #define bend(a) a.begin(), a.end() #define isz(a) ((signed)a.size()) using ll = long long; using ld = long double; using pii = pair <int, int>; using vi = vector <int>; using vpii = vector <pair <int, int>>; using vvi = vector <vector <int>>; #ifdef FEXT void answer(int S[], int D[]); int tryCombination(int S[]); #endif const int N = 5e3 + 5; int n; int s[N], d[N]; int t[N]; int realtryCombination(int S[]){ int ans = tryCombination(S); if (ans == -1){ ans = n; } return ans; } void find_pos(int pos){ if (pos == n){ return; } vi a; For(i, 0, n){ if (d[i] == -1){ a.emplace_back(i); t[i] = 0; } } int val = (realtryCombination(t) > pos ? 0 : 1); int lo = 0, hi = isz(a) - 1; while (lo < hi){ int mid = (lo + hi) >> 1; For(i, 0, isz(a)){ if (i <= mid){ t[a[i]] = 1; } else{ t[a[i]] = 0; } } int tval = (realtryCombination(t) > pos ? 0 : 1); if (val != tval){ hi = mid; } else{ lo = mid + 1; } } d[a[lo]] = pos; s[a[lo]] = val; t[a[lo]] = val; find_pos(pos + 1); } void exploreCave(int _n){ n = _n; For(i, 0, n){ d[i] = -1; } find_pos(0); answer(s, d); } #ifdef FEXT #define MAX_N 5000 #define MAX_CALLS 70000 #define fail(s, x...) do { \ fprintf(stderr, s "\n", ## x); \ exit(1); \ } while(0) /* Symbol obfuscation */ #define N koala #define realS kangaroo #define realD possum #define inv platypus #define num_calls echidna static int N; static int realS[MAX_N]; static int realD[MAX_N]; static int inv[MAX_N]; static int num_calls; void answer(int S[], int D[]) { int i; int correct = 1; for (i = 0; i < N; ++i) if (S[i] != realS[i] || D[i] != realD[i]) { correct = 0; break; } if (correct) printf("CORRECT\n"); else printf("INCORRECT\n"); for (i = 0; i < N; ++i) { if (i > 0) printf(" "); printf("%d", S[i]); } printf("\n"); for (i = 0; i < N; ++i) { if (i > 0) printf(" "); printf("%d", D[i]); } printf("\n"); exit(0); } int tryCombination(int S[]) { int i; if (num_calls >= MAX_CALLS) { printf("INCORRECT\nToo many calls to tryCombination().\n"); exit(0); } ++num_calls; for (i = 0; i < N; ++i) if (S[inv[i]] != realS[inv[i]]) return i; return -1; } int init() { int i, res; FILE *f = fopen("KEK.inp", "r"); if (!f) fail("Failed to open input file."); res = fscanf(f, "%d", &N); for (i = 0; i < N; ++i) { res = fscanf(f, "%d", &realS[i]); } for (i = 0; i < N; ++i) { res = fscanf(f, "%d", &realD[i]); inv[realD[i]] = i; } num_calls = 0; return N; } signed main(){ // ios_base::sync_with_stdio(0); // cin.tie(0); cout.tie(0); // freopen("KEK.inp", "r", stdin); freopen("KEK.out", "w", stdout); int N; N = init(); exploreCave(N); printf("INCORRECT\nYour solution did not call answer().\n"); return 0; } #endif /* ==================================================+ INPUT: | --------------------------------------------------| --------------------------------------------------| ==================================================+ OUTPUT: | --------------------------------------------------| --------------------------------------------------| ==================================================+ */
#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...