ACM준비/algospot

INSERTION

조규현15 2015. 9. 8. 01:55
반응형

https://algospot.com/judge/problem/read/INSERTION

 

algospot.com :: INSERTION

삽입 정렬 뒤집기 문제 정보 문제 유명한 정렬 알고리즘인 삽입 정렬은 정렬된 부분 배열을 유지하며 이 배열에 새 원소를 삽입해 나가는 식으로 동작합니다. 주어진 정수 배열 A를 정렬하는 삽

algospot.com

삽입정렬의 초기값을 구하는 문제임.

1번의 Step마다 내부 Index를 참조하고 삭제해야함.

STL의 vector나 list를 사용하면 시간초과가됨.

재정의하여 내부 참조는 꼼수를 사용하여 해결함.

#include 
#include 

typedef struct node{
	node * prev;
	node * next;
	int value;
}NODE;
int I[50001];
int A[50001];
NODE * Start;
NODE * End;
int Size;
int hN;
int move(int index)
{
	NODE * TARGET;
	int VALUE;
	if (index < hN)
	{
		TARGET = End;
		for (int i = 0; i < index; i++, TARGET = TARGET->prev);
	}
	else
	{
		TARGET = Start;
		for (int i = 0; i < Size - index - 1; i++, TARGET = TARGET->next);
	}

	VALUE = TARGET->value;
	if (TARGET->prev != NULL)TARGET->prev->next = TARGET->next;
	if (TARGET->next != NULL)TARGET->next->prev = TARGET->prev;
	
	if (TARGET == Start) Start = TARGET->next;
	else if (TARGET == End) End = TARGET->prev;

	free(TARGET);
	--Size;
	return VALUE;
}
int main()
{
	int C;
	for (scanf("%d", &C); C>0; C--)
	{
		int N;
		scanf("%d", &N);
		NODE *CUR = NULL;
		for (int i = 0; ivalue = i + 1;
			TEMP->prev = NULL; TEMP->next = NULL;
			TEMP->prev = CUR;
			if (CUR != NULL)
				CUR->next = TEMP;
			else
				Start = TEMP;

			CUR = TEMP;

			scanf("%d", &I[i]);
		}
		Size = N;
		hN = N / 2;
		End = CUR;
		/// PROCESS
		for (int i = N - 1; i>-1; i--)
			A[i] = move(I[i]);
		
		for (int i = 0; i < N; i++)
			printf("%d%c", A[i], (i != N - 1) ? ' ' : '\n');
	}
	return 0;
}
반응형

'ACM준비 > algospot' 카테고리의 다른 글

POTION  (0) 2015.09.10
COINS  (0) 2015.09.09
QUADTREE  (0) 2015.08.24
GRID  (0) 2015.08.18
CLEANER  (0) 2015.08.13