首页 > 其他分享 >洛谷题单指南-线性表-P1160 队列安排

洛谷题单指南-线性表-P1160 队列安排

时间:2024-03-11 19:44:22浏览次数:20  
标签:线性表 idx int 洛谷题 void 链表 P1160 节点 指针

原题链接:https://www.luogu.com.cn/problem/P1160

题意解读:本题是双向链表的模拟题,要快速实现M个节点的删除,用数组模拟链表是最佳做法。

解题思路:

双向链表关键要实现好两个操作:

void add(int k, int v); //在第k个节点后增加第v的号节点,即在k号同学右边插入v号同学

void del(int k); //删除第k个节点,即从队列去掉k号同学

只需要实现右边插入就够了,因为左边插入可以转化为:

add(l[k], v); // 在k号左边插入v,等于在k左边节点的右边插入v

双向链链表插入过程图示:

双向链表删除过程图示:

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;

int head = 0, tail = 1; //链表头、尾节点号
int e[N], l[N], r[N], idx = 2; //e[i]:第i号节点的值、l[i]:第i号节点的左指针、r[i]:第i号节点的右指针 idx:数组下标从2开始,0/1被头、尾节点使用
bool isdel[N]; //是否已经删除

//在idx=k节点右边插入第v号节点
void add(int k, int v)
{
    e[idx] = v; //将v号学生加入数组,下标为idx
    l[r[k]] = idx; //k号右边节点的左指针指向idx
    r[idx] = r[k]; //idx的右指针指向k的右边节点
    l[idx] = k; //idx的左指针指向k
    r[k] = idx; //k的右指针指向idx
    idx++;
}

//删除idx=k节点
void del(int k)
{
    if(isdel[k]) return;
    l[r[k]] = l[k]; //k右边节点的左指针指向k的左边节点
    r[l[k]] = r[k]; //k左边节点的右指针指向k的右边节点
    isdel[k] = true;
}

//初始化
void init()
{
    r[head] = tail; //把头、尾节点相连
    l[tail] = head; //把头、尾节点相连
    add(head, 1); //在头节点右边加入1号同学
}

//从左到右输出
void print()
{
    for(int i = r[head]; i != tail; i = r[i])
    {
        cout << e[i] << " ";
    }
}

int main()
{
    int n, m;
    cin >> n;
    init(); //初始化
    int k, p;
    for(int i = 2; i <= n; i++)
    {
        cin >> k >> p;
        if(p == 1) add(k + 1, i); //因为数组0/1号是头、尾节点,第1号学生在下标2的节点,第k号学生在下标k+1的节点
        else add(l[k + 1], i);
    }
    int x;
    cin >> m;
    while(m--)
    {
        cin >> x;
        del(x + 1);
    }
    print();

    return 0;
}

 

标签:线性表,idx,int,洛谷题,void,链表,P1160,节点,指针
From: https://www.cnblogs.com/jcwy/p/18066901

相关文章

  • 洛谷题单指南-线性表-P1996 约瑟夫问题
    原题链接:https://www.luogu.com.cn/problem/P1996题意解读:约瑟夫问题是队列的典型应用。解题思路:n个人围圈报数,可以直接基于数组实现循环队列操作,再定义额外数组记录每个人是否已经出圈即可。更直观的做法,定义队列,初始放入1~n,然后重复n次,每次从1~m报数,如果报数到m,直接出队,......
  • 洛谷题单指南-线性表-P3613 【深基15.例2】寄包柜
    原题链接:https://www.luogu.com.cn/problem/P3613题意解读:此题很容易想成用二维数组求解,但是最多有10^5*10^5个寄包柜格子,二维数据会爆空间,题目明确各自一共不超过10^7,所以需要动态数据结构vector。解题思路:vector的问题在于需要提前明确空间大小,才能进行随即访问操作,否则可......
  • 洛谷题单指南-线性表-P3156 【深基15.例1】询问学号
    原题链接:https://www.luogu.com.cn/problem/P3156解题思路:简单的数组题,唯一需要注意的是读写的数据量比较大,输入输出最好用scanf、printf100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=2e6+5;inta[N],n,m;intmain(){scanf("%d%d",&......
  • 洛谷题单指南-搜索-P1825 [USACO11OPEN] Corn Maze S
    原题链接:https://www.luogu.com.cn/problem/P1825题意解读:计算最短路,依然是BFS。解题思路:相比传统的最短路迷宫,多了个传输装置,要解决几个关键问题:1、传输装置的存储定义一个数组,vector<node>trans[30],数据的每个元素都是一个vector<node>,里面存两个节点,即一对坐标2、传输......
  • 洛谷题单指南-搜索-P1032 [NOIP2002 提高组] 字串变换
    原题链接:https://www.luogu.com.cn/problem/P1032题意解读:要计算子串变换的最少步数,典型的最短路问题,可以通过BFS求解。解题思路:思路上比较直观,从给定的字符串开始,找有多少种替换可能,依次进行替换,存入队列,继续BFS,过程中记录替换的次数但是,有一些细节还需要注意:1、有多种替换......
  • 洛谷题单指南-搜索-P1162 填涂颜色
    原题链接:https://www.luogu.com.cn/problem/P1162题意解读:要把闭合圈内的0填为2,DFS处理即可。解题思路:由于方阵内只有一个闭合圈,所以闭合圈以外的0一定和边缘相连通,只需要从边缘开始,把0的连通块全部标记为2最后再输出时,2输出0,1输出1,0输出2,即可得解。100分代码:#include<bits......
  • 洛谷题单指南-搜索-P2404 自然数的拆分问题
    原题链接:https://www.luogu.com.cn/problem/P2404题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。解题思路:通过DFS,每次填一个数,填数时从1~n-1逐个填注意两个条件不能继续DFS:1、将填的数之和超过n2、将填的数小于上一次填......
  • 洛谷题单指南-搜索-P1101 单词方阵
    原题链接:https://www.luogu.com.cn/problem/P1101题意解读:对于方阵中的每一个字符,在8个方向上判断是否和"yizhong"匹配,是一个递归问题。解题思路:用chara[N][N]存储所有字符方阵,用boolb[N][N]标记每个字符是否在任一方向上和yizhong匹配遍历方阵每一字符,如果是'y'则在8个方......
  • 洛谷题单指南-搜索-P1019 [NOIP2000 提高组] 单词接龙
    原题链接:https://www.luogu.com.cn/problem/P1019题意解读:要计算接龙能得到的最长字符串,可以通过DFS暴搜所有可能的接龙方案解题思路:DFS的关键在于两个判断:1、下一个单词是否可以和上一个单词接龙,最短公共长度是多少(只需要看两个单词的最短公共长度,这样能保证接龙更长)2、单词......
  • 数据结构-线性表
    线性表由n(n>=0)个数据特性相同的元素构成的有限序列,称为线性表。他是最基本、最简单、也是最常用的一种数据结构。线性表结构中,数据元素之间通过一对一首尾相接的方式连接起来。特点:存在唯一一个被称为“第一个”的数据元素存在唯一一个被成为“最后一个”的数据元素。除了......