1074. Reversing Linked List (25)

模拟题,注意当k == 1 与 k == n时情况

#include <stdio.h>

#include <string.h>

#include <iostream>

#include <algorithm>

#include <map>



using namespace std;



const int N = 100005;



struct Node

{

	int pre;

	int value;

	int lat;

}node[N];



int order[N];

int size;

map<int, int> pre2idx;



void solve1(int fir, int n)

{

	map<int, int>::iterator it = pre2idx.find(fir);

	order[size++] = it->second;



	while (node[it->second].lat != -1)

	{

		it = pre2idx.find(node[it->second].lat);

		order[size++] = it->second;

	}

}



void solve2(int k, int n)

{

	int bound = n / k * k;



	int idx = k;

	while (idx <= bound)

	{

		int boundt = idx;

		int boundb = idx - k + 1;

		while (boundt >= boundb)

		{

			int next = 0;

			if (boundt > boundb) next = boundt - 1;

			else 

			{

				if (idx < bound)

					next = idx + k;

				else if (idx == bound)

				{

					if (bound < n)

						next = idx + 1;

					else if (bound == n)

					{

						printf("%05d %d -1\n", node[order[boundt]].pre, node[order[boundt]].value);

						break;

					}

				}

			}

			printf("%05d %d %05d\n", node[order[boundt]].pre, node[order[boundt]].value, node[order[next]].pre);

			boundt--;

		}

		idx += k;

	}

	bound++;

	while (bound <= n)

	{

		if (node[order[bound]].lat != -1)

			printf("%05d %d %05d\n", node[order[bound]].pre, node[order[bound]].value, node[order[bound]].lat);

		else 	printf("%05d %d -1\n", node[order[bound]].pre, node[order[bound]].value);

		bound++;

	}

	

}



int main()

{

	int fir, n, k;



	while (scanf("%d%d%d", &fir, &n, &k) != EOF)

	{

		pre2idx.clear(); size = 1;

		for (int i = 0; i < n; i++)

		{

			scanf("%d%d%d", &node[i].pre, &node[i].value, &node[i].lat);

			pre2idx.insert(make_pair(node[i].pre, i));

		}



		solve1(fir, n);



		solve2(k , size - 1);



	}

	return 0;

}



/*

00100 6 6

00000 4 99999

00100 1 -1

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

*/













	





	

  

你可能感兴趣的:(list)