时间限制:1000MS 代码长度限制:10KB
题型: 编程题 语言: G++;GCC
Description
老师要将N张试卷重新排序,每张试卷都有编号为1∼N,采取如下的方法: 先将编号1的试卷放进队列,剩下从第2张到第N张依次放入队列, 放入的时候老师会把编号i的试卷插入到编号为x试卷之前或之后(x<i), 在老师完成这N-1次操作之后,请输出试卷序列的最终编号。
输入格式
第1行为一个正整数N,表示了有N张试卷。 第2-N行,第i行包含两个整数x,p,其中x为小于i的正整数,p为0或者1。 若p为0,则表示将编号为i的试卷放入编号为x试卷的左边,为1则放入x试卷的右边。
输出格式
输出N个整数,表示完成插入后试卷系列中试卷的编号(1<=N<=100000)。
输入样例
4 1 0 2 1 1 0
输出样例
2 3 4 1
提示
4张试卷。第二行1,0,将编号2的试卷放入编号1的左边,则序列为2 1; 第三行2,1,将编号3试卷放入编号2试卷的右边,则序列为2 3 1; 第四行1 0,将编号4的试卷放入编号1的左边,则序列为2 3 4 1。
思路:使用顺序表记录第x张卷子的位置,弥补链表不能随机访问的缺点。
#include <iostream>//C++
using namespace std;
/*
4
1 0
2 1
1 0
*/
typedef struct Lnode //定义链结点
{
int m_data;
struct Lnode *prev, *next;
};
int main()
{
int N;
int x, p;
scanf("%d", &N); //N张试卷
Lnode* List[N]; //用于存放链表结点
Lnode *head = new Lnode; //创建头结点
Lnode *L, *it; //定义一个Lnode指针用于后续结点插入
L = new Lnode;
L->m_data = 1;
head->next = L;
L->next = head;
head->prev = L;
L->prev = head;//创建循环链表方便插入结点
List[0] = L; //将第一张卷子放入顺序表
for(int i = 1; i < N; ++i)
{
scanf("%d %d", &x, &p);
L = new Lnode; //开辟新空间插入第(i+1)张试卷
L->m_data = i+1;
it = List[x-1]; //让it指向当前第x张试卷
if(p)//插入x试卷右边
{
L->next = it->next;
L->next->prev = L;
L->prev = it;
it->next = L;
}
else//插入x试卷左边
{
L->prev = it->prev;
L->prev->next = L;
L->next = it;
it->prev = L;
}
List[i] = L; //将L写入顺序表
}
L = head->next;
while(L != head)
{
printf("%d ", L->m_data);
L = L->next;
}
return 0;
}