답안 #117178

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
117178 2019-06-15T08:02:06 Z 임유진(#2871) Treasure Hunt (CEOI11_tre) C++14
0 / 100
518 ms 78712 KB
#include<stdio.h>

#define MAXN 400010

int n;
int num[MAXN], dep[MAXN], pidx[MAXN][20], pnum[MAXN][20], pdep[MAXN][20];

int bsnum(int x){
	int s=0, e=n-1;
	while(s<e){
		int m=(s+e)/2;
		if(x<=num[m]) e=m;
		else s=m+1;
	}
	return s;
}

int bsdep(int d, int idx){
	for(int i=19; i>=0; i--)
		if(pdep[idx][i]>=d) idx=pidx[idx][i];
	return idx;
}

void init(){
	n=1;
	num[0]=1;
	dep[0]=0;
	for(int i=0; i<20; i++){
		pidx[0][i]=pdep[0][i]=0;
		pnum[0][i]=1;
	}
}

void path(int a, int s){
	num[n]=num[n-1]+s;
	pidx[n][0]=bsnum(a);
	pdep[n][0]=dep[pidx[n][0]]-num[pidx[n][0]]+a;
	pnum[n][0]=a;
	dep[n]=pdep[n][0]+s;
	for(int i=1; i<20; i++){
		pidx[n][i]=pidx[pidx[n][i-1]][i-1];
		pdep[n][i]=pdep[pidx[n][i-1]][i-1];
		pnum[n][i]=pnum[pidx[n][i-1]][i-1];
	}
	n++;

	/*
	for(int i=0; i<n; i++){
		printf("%d %d [", num[i], dep[i]);
		for(int j=0; j<5; j++) printf("%d ", pidx[i][j]);
		printf("] [");
		for(int j=0; j<5; j++) printf("%d ", pdep[i][j]);
		printf("]\n");
	}
	*/
}

int dig(int a, int b){
	bool c=false;
	if(a>b){
		int t=a;
		a=b;
		b=t;
		c=true;
	}

	int aidx=bsnum(a), bidx=bsnum(b);
	if(aidx==bidx) return c?(a+b+1)/2:(a+b)/2;
	int adep=dep[aidx]-num[aidx]+a, bdep=dep[bidx]-num[bidx]+b;
	if(bsdep(adep, bidx)==aidx){
		int d=c?(adep+bdep+1)/2:(adep+bdep)/2;
		int idx=bsdep(d, b);
		return num[idx]-dep[idx]+d;
	}
	//printf("[%d %d %d %d]\n", aidx, bidx, adep, bdep);
	int btidx=bidx;
	for(int i=2; i>=0; i--){
		//printf("{%d %d}\n", bsdep(pdep[btidx][i], aidx), pidx[btidx][i]);
		if(bsdep(pdep[btidx][i], aidx)!=pidx[btidx][i]){
			btidx=pidx[btidx][i];
		}
		//printf("(%d)\n", btidx);
	}
	if(adep<bdep){
		int k=c?(bdep-adep+1)/2:(bdep-adep)/2;
		if(k==0){
			//printf("*");
			return pnum[btidx][0];
		}
		else return num[btidx]-dep[btidx]+pdep[btidx][0]+k;
	}
	else{
		int atidx=bsdep(pdep[btidx][0], aidx);
		return num[atidx]-dep[atidx]+pdep[btidx][0]+(c?(adep-bdep)/2:(bdep-adep+1)/2);
	}
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 504 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 518 ms 78712 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 472 ms 11356 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 437 ms 50872 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 8 ms 632 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 8 ms 760 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Runtime error 7 ms 376 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 477 ms 50856 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 480 ms 50924 KB Output isn't correct