P1160 队列安排 luogu洛谷

本文介绍了一种算法,用于解决学生按特定规则排队的问题,包括插入和删除操作,通过双向链表实现高效的学生编号排序。

题目描述

一个学校里老师要将班上NNN个同学排成一列,同学被编号为1∼N1\sim N1N,他采取如下的方法:

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

  2. 2−N2-N2N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1∼(i−1)1\sim (i -1)1(i1)中某位同学(即之前已经入列的同学)的左边或右边;

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

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

输入输出格式

输入格式:

 

111行为一个正整数NNN,表示了有NNN个同学。

2−N2-N2N行,第iii行包含两个整数k,pk,pk,p,其中kkk为小于iii的正整数,ppp为000或者111。若ppp为000,则表示将iii号同学插入到kkk号同学的左边,ppp为111则表示插入到右边。

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

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

 

输出格式:

 

111行,包含最多NNN个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。

 

输入输出样例

输入样例#1: 复制
4
1 0
2 1
1 0
2
3
3
输出样例#1: 复制
2 4 1

说明

样例解释:

将同学222插入至同学111左边,此时队列为:

212 121

将同学333插入至同学222右边,此时队列为:

2312 3 1231

将同学444插入至同学111左边,此时队列为:

23412 3 4 12341

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

2412 4 1241

同学333已经不在队列中,忽略最后一条指令

最终队列:

2412 4 1241

数据范围

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

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

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

 

----------------------------------------分割分割分割------------------------------------------------------------------------

很基础很基础

我拿不准的地方在于

如何输出:

第一个是什么?

 

所以借鉴了一下

-----------------------------------------------------------------------------------------------------------------------------------

#include<cstdio>
using namespace std;
#define maxn 100010
int data[maxn],nxt[maxn],pre[maxn];
int n,cnt = 1;
bool flag[maxn];
void add(int l,int r,int x) {
    data[++cnt] = x;
    pre[cnt] = l;
    nxt[cnt] = r;
    nxt[l] = cnt;
    pre[r] = cnt;
}
void del(int x) {
    nxt[pre[x]] = nxt[x];
    pre[nxt[x]] = pre[x];
}
int main() {
    scanf("%d",&n);
    data[1] = 1;
    int head = 1;
    flag[1] = true;
    for(int i = 2; i <= n; i++) {
        int k,p;
        scanf("%d%d",&k,&p);
        flag[i] = true;
        if(p == 0) {
            if(k == head)
                head = i;
            add(pre[k],k,i);
        } else
            add(k,nxt[k],i);
    }
    int m;
    scanf("%d",&m);
    for(int i = 1; i <= m; i++) {
        int x;
        scanf("%d",&x);
        if(!flag[x])
            continue;
        if(x == head)
            head = nxt[x];
        del(x);
        cnt--;
        flag[x] = false;
    }
    for(int i = head; cnt; i = nxt[i]) {
        printf("%d ",data[i]);
        cnt--;
    }
    return 0;
}
----------------------------------------------------------------------------------------------
 
希望下次记得
设一个变量
用来记录第一个元素
 
加油

转载于:https://www.cnblogs.com/darlingroot/p/10296663.html

<think>好的,我需要帮助用户查找P9244题目的解析或代码实现。首先,用户提到的引用内容是关于其他题目的,比如P2241、P2089、P1152,但并没有提到P9244。这说明用户提供的引用资料里可能没有直接相关的信息。 接下来,我应该检查用户给出的引用内容是否有任何与P9244相关的内容。根据引用1到4,都是关于不同题目的题解,比如统计方形、烤鸡、欢乐的跳等,但没有提到P9244。因此,可能需要建议用户通过其他途径查找,比如官网或相关论坛。 另外,用户可能需要指导如何自行查找P9244的解析。可以建议他们使用的搜索功能,或者查看题目的讨论区。还可以提到常见的解题方法,比如枚举、动态规划、数据结构应用等,作为可能的解题方向。 需要注意的是,回答要结构清晰,用中文,并遵循格式要求,比如数学表达式用$...$,独立公式用$$...$$。同时生成相关问题,帮助用户进一步探索。 总结步骤: 1. 指出当前引用中没有P9244的信息。 2. 建议用户通过官网或社区查找。 3. 提供一般性的解题策略。 4. 生成相关问题,帮助用户深入解题。</think>根据您提供的引用内容,目前未发现与P9244题目直接相关的解析或代码实现。不过基于题目的分类特点,以下提供通用的解题思路和资源查找建议: ### 一、题目解析通用方法 1. **题目分类识别** 首先需确认P9244的标签类型(如数学、图论、动态规划等)。例如: - 若涉及数学公式推导,可能需使用组合数学公式:$$C(n,k) = \frac{n!}{k!(n-k)!}$$ - 若为图论题,可能涉及最短路径算法如Dijkstra 2. **代码实现框架** 根据题目类型选择算法模板: ```python # 动态规划示例框架 def dp_solution(n): dp = [0]*(n+1) dp[0] = 1 for i in range(1, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] ``` ### 二、资源查找建议 1. **官方题解** 登录题目页面,查看「讨论」或「题解」板块,通常会有用户提交的解析[^1] 2. **搜索引擎技巧** 使用精确搜索:`"P9244" site:luogu.com.cn` 3. **算法竞赛社区** 在Codeforces、优快云等平台搜索题目编号,可能找到相关分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值