题解 P1160 【队列安排】

0.前言

老师布置的作业题。

有点水

1.正文

具体思路

数组实现简单的双链表操作:插入、删除。

注意事项

删除时记得标记,已不在队列中的忽略。

代码


#include <cstdio>

const int N = 100000;
int idx, e[N+5], fr[N+5], ne[N+5];

void init()
{
	idx = 2;
	fr[1] = 0;
	ne[0] = 1;
}

void insertL(int k, int x)
{
	fr[idx] = fr[k];
	ne[idx] = k;
	ne[fr[idx]] = idx;
	fr[k] = idx;
	e[idx++] = x;
}

void insertR(int k, int x)
{
	ne[idx] = ne[k];
	fr[idx] = k;
	fr[ne[idx]] = idx;
	ne[k] = idx; 
	e[idx++] = x;
}

void delX(int k)
{
	fr[ne[k]] = fr[k];
	ne[fr[k]] = ne[k];
	fr[k] = -1;
	ne[k] = -1;
}

int main() {
	init();
	int n, k, p, m, x;
	
	scanf("%d", &n);
	for (int i=2; i<=n; i++) {
		scanf("%d %d", &k, &p);
		if (p) insertR(k, i);
		else insertL(k, i);
	}
	scanf("%d", &m);
	for (int i=1; i<=m; i++) {
		scanf("%d", &x);
		if (fr[x]==-1 && ne[x]==-1) continue;
		delX(x);
	}
	
	for (int i=1; i<=n; i++) { 
		if (fr[i] == 0) {
			x = i;
			break;
		}
	}
	do {
		printf("%d ", x);
		x = ne[x];
	}while (x > 0);
	printf("\n");
	
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值