# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
230865 | AASG | 동굴 (IOI13_cave) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define MAX_N 5000
#define MAX_CALLS 70000
#define fail(s, x...) do { \
fprintf(stderr, s "\n", ## x); \
exit(1); \
} while(0)
#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;
}
using namespace std;
void exploreCave(int N) {
int n=N;
int R[n];int P[n];
int aux1[n],aux2[n];
memset(aux1,1,sizeof(aux1));
memset(P,0,sizeof(P));
for(int i=0;i<n;i++){
R[i]=1;
P[i]=0;
}
for(int i=0;i<n;i++){
for(int i=0;i<n;i++)aux2[i]=R[i];
int p1=0,p2=n;
int x=tryCombination(aux2);
while(abs(p1-p2)!=1){
int p3=(p1+p2)/2;
for(int i=0;i<n;i++){
if(P[i]==0){
aux2[i]=0;
}
}
int y=tryCombination(aux2);
if(x>i && y>i){
p1=p3;
}else{
p2=p3-1;
}
}
if(aux2[p2]==1){aux2[p2]=0;}
else aux2[p2]=1;
if(tryCombination(aux2)<n+1){
if(aux2[p2]==1){aux2[p2]=0;}
else aux2[p2]=1;
R[p2]=aux2[p2];
P[p2]=n+1;
}
}
answer(R,P);
}
int init() {
int i, res;
FILE *f = fopen("cave.in", "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;
}
int main() {
int N;
N = init();
exploreCave(N);
printf("INCORRECT\nYour solution did not call answer().\n");
return 0;
}