首页 > 其他分享 >数组模拟双向列表 洛谷 P1160 队列安排

数组模拟双向列表 洛谷 P1160 队列安排

时间:2023-03-25 13:34:41浏览次数:35  
标签:同学 head right 洛谷 队列 插入 P1160 left


题目描述

一个学校里老师要将班上N个同学排成一列,同学被编号为1~N,他采取如下的方法:

1.先将1号同学安排进队列,这时队列中只有他一个人;

2.2~N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1~i -1中某位同学(即之前已经入列的同学)的左边或右边;

3.从队列中去掉M(M<N)个同学,其他同学位置顺序不变。

在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。

输入输出格式

输入格式:

输入文件arrange.in的第1行为一个正整数N,表示了有N个同学。

第2~第N行,第i行包含两个整数k,p,其中k为小于i的正整数,p为0或者1。若p为0,则表示将i号同学插入到k号同学的左边,p为1则表示插入到右边。

第N+1行为一个正整数M,表示去掉的同学数目。

接下来M行,每行一个正整数x,表示将x号同学从队列中移去,如果x号同学已经不在队列中则忽略这一条指令。

输出格式:

输入文件arrange.out仅包括1行,包含最多N个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。

输入输出样例

输入样例#1: 复制

4
1 0
2 1
1 0
2
3
3

输出样例#1: 复制

2 4 1

说明

样例解释:

将同学2插入至同学1左边,此时队列为:

2 1 将同学3插入至同学2右边,此时队列为:

2 3 1 将同学4插入至同学1左边,此时队列为:

2 3 4 1

将同学3从队列中移出,此时队列为:

2 4 1 同学3已经不在队列中,忽略最后一条指令

最终队列:

2 4 1 数据范围

对于20%的数据,有N≤10;

对于40%的数据,有N≤1000;

对于100%的数据,有N, M≤100000。

代码实现

 

//数组模拟双向列表
#include<bits/stdc++.h>
using namespace std;
#define N 100010
struct Node
{
    int n;//保存节点值
  Node *left,*right;
  Node(int t)//巧妙的构造函数
   {
        left=right=NULL;
        n=t;
    }
};
int main()
{
    Node *p[N];
    int i,n,k,d,head=1;
    p[1]=new Node(1);
    cin>>n;
    /*插入过程*/
    for(i=2;i<=n;i++)
    {
        p[i]=new Node(i);
      scanf("%d%d",&k,&d);
       if(d==0)//左边插入
       {

           if(p[k]->left)//在两个数中间插入
           {
             p[k]->left->right=p[i];
             p[i]->left=p[k]->left;
           }
          p[k]->left=p[i];
          p[i]->right=p[k];
          if(k==head) head=i;//更新队头

       }
       else//右边插入
       {
           if(p[k]->right)
           {
               p[k]->right->left=p[i];
               p[i]->right=p[k]->right;
           }
           p[k]->right=p[i];
           p[i]->left=p[k];
       }

    }
    /*删除过程*/
    int m;
    cin>>m;
    for(i=1;i<=m;i++)
    {
      scanf("%d",&k);
      if(p[k]->left)
       p[k]->left->right=p[k]->right;
      if(p[k]->right)
      {
          p[k]->right->left=p[k]->left;
          if(k==head)
            head=p[k]->right->n;//更新头节点
      }
      p[k]->left=p[k]->right=NULL;
    }
/*输出*/
    while(p[head])
    {
        printf("%d ",p[head]->n);
        p[head]=p[head]->right;
    }

    return 0;
}


标签:同学,head,right,洛谷,队列,插入,P1160,left
From: https://blog.51cto.com/u_14932227/6149361

相关文章

  • 225. 用队列实现栈
    请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop和empty)。实现MyStack类:voidpush(intx)将元素x压入栈顶。intpop()移......
  • 3 - 进程 - Windows 10 - Cpython - 多进程通信 - 队列Queue _ 管道Pipe _ 共享内存Sh
    @目录一、进程通信概述:二、进程间交互对象——不用加锁1.消息队列(Queue)2.管道(Pipe)半双工三、进程间同步——需加锁,保证数据安全1.共享内存sharememory(Value、Ar......
  • laravel5.6 基于redis,使用消息队列(邮件推送)
    laravel5.6基于redis,使用消息队列(邮件推送)用户表config/queue.php文件如下config/database.php创建队列任务类(app/Jobs/xxx.php)控制器将数据添加到队列中启动、监听队列监......
  • laravel之horizon队列管理系统
    horizon简介horizon为您的LaravelRedis队列提供了漂亮的仪表板和代码驱动配置。Horizon允许您轻松监控队列系统的关键指标,例如作业吞吐量,运行时和作业失败。您的所有......
  • 「双端队列BFS」电路维修
    本题为3月23日23上半学期集训每日一题中B题的题解题面题目描述Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上。Rika......
  • bzoj 2006 [NOI2010] 超级钢琴 线段树求区间极值+优先队列
    挺神奇的一道题,唯一想不通的是为什么放在主席树的题单里..首先暴力找出所有的合法区间显然是不可能的。考虑怎么贪心,假如固定每个L作为左端点,那么合法的区间就是[L+l-1,L......
  • 队列及阻塞队列基础
    队列:先进先出的数据结构(FIFO)java中的队列接口在java.util包下常见的对列实现类有LinkedList   常见的阻塞队列:LinkedBlockingDeque,可以设置固定的容量,当队列有数......
  • 232. 用栈实现队列
    请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()......
  • 洛谷 P1967 货车运输
    P1967NOIP2013提高组]货车运输-洛谷|计算机科学教育新生态(luogu.com.cn)这个题目算是lca的稍微拓展吧。主要思考方向应该是很明显的。就是考虑一条路径上权值最......
  • 优先队列
    什么是优先队列:优先队列就好比会员制的队列,有优先级这一特殊属性,根据优先级的高低来确定出队顺序优先队列也是一种抽象数据类型。优先队列中的每个元素都有优先级,而优先......