P1160 隊列安排題解

題目

一個學校里老師要將班上N個同學排成一列,同學被編號為1~N,他采取如下的方法:

  1. 先將1號同學安排進隊列,這時隊列中只有他一個人;

  2. 2~N號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1~(i?1)中某位同學(即之前已經入列的同學)的左邊或右邊;

  3. 從隊列中去掉M個同學,其他同學位置順序不變。

在所有同學按照上述方法隊列排列完畢后,老師想知道從左到右所有同學的編號。

輸入輸出格式

輸入格式

第一行一個整數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號同學已經不在隊列中則忽略這一條指令。

輸出格式

一行,包含最多N個空格隔開的整數,表示了隊列從左到右所有同學的編號。

輸入輸出樣例

輸入樣例

4
1 0
2 1
1 0
2
3
3

輸出樣例

2 4 1

補充知識

鏈表的使用,可以完成以下的操作,實現一個數據結構,維護一張表(最初只有一個元素1)。支持以下的操作,其中x,y都是int范圍內的正整數,且都不一樣。

(1)ins_back(x,y):將元素y插入到x后面

(2)ins_front(x,y):將元素y插入到x前面

(3)ask_back(x):詢問x后面的元素

(4)ask_front(x):詢問x前面的元素

(5)del(x):從表中刪除元素x,不改變其他元素的先后順序

struct node{int pre,nxt;//分別記錄前驅和后繼結點在數組s中的下標int key;node(int _key=0,int _pre=0,int _nxt=0){pre=_pre;nxt=_nxt;key=_key;}
};
node s[100005];
//一個池,以后想要新建一個結點,就從s數組里面拿出一個位置給新結點
//也可以使用指針new,delete實現
int tot=0;//記錄s數組目前使用了多少個位置,那么下一個可用的位置就是s[tot+1]
int find(int x){//查找x的結點編號,需要遍歷整個鏈表int now=1;while(now&&s[now].key!=x){now=s[now].nxt;return now;} 
} 
void ins_back(int x,int y){//y插在x后面 int now=find(x);s[++tot]=node(y,now,s[now].nxt);s[s[now].nxt].pre=tot;s[now].nxt=tot;
}
void ins_front(int x,int y){//y插在x前面 int now=find(x);s[++tot]=node(y,s[now].pre,now);s[s[now].pre].nxt=tot;s[now].pre=tot;
}
int ask_back(int x){int now=find(x);return s[s[now].nxt].key;
}
int ask_front(int x){int now=find(x);return s[s[now].pre].key;
}
void del(int x){int now=find(x);int le=s[now].pre,rt=s[now].nxt;s[le].nxt=rt;s[rt].pre=le;
}

當然STL庫也提供了鏈表的相關操作,需要使用list的頭文件。支持以下的常用方法。

(1)list<int> a:定義一個int類型的鏈表a

(2)int arr[5]={1,2,3};lsit<int> a(arr,arr+3):從數組arr中的前三個元素作為鏈表a的初始值

(3)a.size():返回鏈表的結點數量

(4)list<int>::iterator it:定義一個名為it的迭代器(指針)

(5)a.begin();a.end():鏈表開始和末尾的迭代器指針

(6)it++;it--:迭代器指向前一個和后一個元素

(7)a.push_front(x);a.push_back():在鏈表開頭或者末尾插入元素x

(8)a.insert(it,x):在迭代器it的前插入元素x

(9)a.pop_front();a.pop_back():刪除鏈表開頭或者末尾

(10)a.erase(it):刪除迭代器it所在的元素

(11)for(it=a.begin();it!=a.end();it++):遍歷鏈表

解析

此題目利用一個雙向鏈表維護這個隊伍,每個同學記錄自己左邊和右邊的同學。這樣各種操作都可以O\left ( 1 \right )的復雜度完成。可以使用上面的鏈表模板,但是需要稍微修改一下插入函數和刪除函數。使用數組index定位某位同學的結點編號,在插入和刪除時直接找到這位同學的結點編號,在插入時還要記錄下這名同學的結點編號。這樣就不需要每次都要遍歷整個鏈表了。

#include<iostream>
using namespace std;
struct node{int pre,nxt,key;node(int _key=0,int _pre=0,int _nxt=0){pre=_pre;nxt=_nxt;key=_key;}
};
node s[100005];
int n,m,tot=0,index[100005]={0};//記錄每個位置的結點編號
void ins_back(int x,int y){int now=index[x];//查找索引s[++tot]=node(y,now,s[now].nxt);s[s[now].nxt].pre=tot;s[now].nxt=tot;index[y]=tot;//記錄索引
}
void ins_front(int x,int y){int now=index[x];s[++tot]=node(y,s[now].pre,now);s[s[now].pre].nxt=tot;s[now].pre=tot;index[y]=tot;
}
void del(int x){int now=index[x];int le=s[now].pre,rt=s[now].nxt;s[le].nxt=rt;s[rt].pre=le;index[x]=0;
}
int main(){int x,k,p,now;cin>>n;s[0]=node();//令0恒為最左邊的結點ins_back(0,1);for(int i=2;i<=n;i++){cin>>k>>p;p ? ins_back(k,i):ins_front(k,i);}cin>>m;for(int i=1;i<=m;i++){cin>>x;if(index[x]){del(x);}}now=s[0].nxt;while(now){cout<<s[now].key<<" ";now=s[now].nxt;}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711503.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

下載huggingface數據集到本地并讀取.arrow文件遇到的問題

文章目錄 1. 524MB中文維基百科語料&#xff08;需要下載的數據集&#xff09;2. 下載 hugging face 網站上的數據集3. 讀取 .arrow 文件報錯代碼4. 糾正后代碼 1. 524MB中文維基百科語料&#xff08;需要下載的數據集&#xff09; 2. 下載 hugging face 網站上的數據集 要將H…

MATLAB環境下一種新穎的類脈沖信號的高分辨率時頻分析方法

一般情況下&#xff0c;機械振動信號或地震信號是非平穩的。而傳統傅立葉變換只能應用于平穩信號分析&#xff0c;故不適用于非平穩信號。所以&#xff0c;我們需要采用時頻分析方法。時頻分析方法能達到同時在時間域和頻率域對信號進行分析的目的&#xff0c;得到信號在不同時…

Python爬取網站視頻資源

思路&#xff1a; 在界面找到視頻對應的html元素位置&#xff0c;觀察發現視頻的url為https://www.pearvideo.com/video_視頻的id&#xff0c;而這個id在html中的href中&#xff0c;所以第一步需要通過xpath捕獲到所需要的id 在https://www.pearvideo.com/video_id的頁面&…

線程池學習

github看到一個項目&#xff08;GitHub - markparticle/WebServer: C Linux WebServer服務器&#xff09;&#xff0c;內部使用的一個線程池看著不錯&#xff0c;拿來學習一下。 /** Author : mark* Date : 2020-06-15* copyleft Apache 2.0*/ #ifndef THREADPO…

Windows系統搭建VisualSVN并結合內網穿透實現遠程訪問本地服務

文章目錄 前言1. VisualSVN安裝與配置2. VisualSVN Server管理界面配置3. 安裝cpolar內網穿透3.1 注冊賬號3.2 下載cpolar客戶端3.3 登錄cpolar web ui管理界面3.4 創建公網地址 4. 固定公網地址訪問 前言 SVN 是 subversion 的縮寫&#xff0c;是一個開放源代碼的版本控制系統…

js實現轉義、反轉義

兩種思路&#xff0c;一種是列出需要用到的轉義項&#xff0c;通過正則來轉化&#xff1b;另一種通過轉化為html語言&#xff0c;通過瀏覽器幫助我們翻譯&#xff0c;然后獲取innerText var HtmlUtil {/*1.用瀏覽器內部轉換器實現html編碼&#xff08;轉義&#xff09;*/html…

Spring 事務常見錯誤(上)

通過上一章的學習&#xff0c;我們了解了 Spring Data 操作數據庫的一些常見問題。這一章我們聊一聊數據庫操作中的一個非常重要的話題——事務管理。 Spring 事務管理包含兩種配置方式&#xff0c;第一種是使用 XML 進行模糊匹配&#xff0c;綁定事務管理&#xff1b;第二種是…

洗澡、泡腳真的能養生? 皮膚科醫生來科普

現如今人們越來越注重健康與養生&#xff0c;除了枸杞、生姜等食補外&#xff0c;各種保健方法和保健產品也層出不窮&#xff0c;還有泡腳、洗涼水澡等養生延緩衰老的方式也廣泛流行&#xff0c;那么泡腳與洗涼水澡真的有用嗎?西安國際醫學中心醫院皮膚科主任高鵬程特意進行了…

Timeplus-proton流處理器調研

概念 Timeplus是一個流處理器。它提供強大的端到端功能&#xff0c;利用開源流引擎Proton來幫助數據團隊快速直觀地處理流數據和歷史數據&#xff0c;可供各種規模和行業的組織使用。它使數據工程師和平臺工程師能夠使用 SQL 釋放流數據價值。 Timeplus 控制臺可以輕松連接到不…

K8S相關小技巧《一》

在實際使用Kubernetes的時候有一些常用的小技巧&#xff0c;在此分享給大家&#xff1a; 獲取用于拉取docker的密鑰的原本值&#xff0c;k8s docker registry pull secret decode&#xff1a; kubectl get secret/registry-pull-secret -n kube-iapply-qa -o json | jq .data…

女性三八節禮物攻略:她無法抗拒的五大禮物

隨著春風的溫柔拂面&#xff0c;我們即將迎來一年一度的三八國際婦女節。這個特別的日子&#xff0c;不僅是對女性貢獻的認可和慶祝&#xff0c;也是向我們生命中的女性表達感激和愛意的絕佳時機。在這個充滿溫馨和敬意的時刻&#xff0c;我們常常在思考&#xff0c;如何用一份…

信息學奧賽一本通1310:【例2.2】車廂重組

1310&#xff1a;【例2.2】車廂重組 時間限制: 1000 ms 內存限制: 65536 KB 提交數: 48051 通過數: 28919 【題目描述】 在一個舊式的火車站旁邊有一座橋&#xff0c;其橋面可以繞河中心的橋墩水平旋轉。一個車站的職工發現橋的長度最多能容納兩節車廂&#xff0c…

elementUI el-table中的對齊問題

用elementUI時&#xff0c;遇到了一個無法對齊的問題&#xff1a;代碼如下&#xff1a; <el-table :data"form.dataList" <el-table-column label"驗收結論" prop"checkResult" width"200"> <template slot-sco…

0005TS函數類型詳解

TypeScript 中的函數類型用于為函數定義參數類型和返回值類型。這提供了一個清晰的契約&#xff0c;指明函數應該如何被調用和期望返回什么類型的結果。以下是 TypeScript 中函數類型的一些基本用法和概念&#xff1a; 函數聲明 在 TypeScript 中&#xff0c;你可以為函數的參…

揭秘!Excel如何成為職場中的價值創造利器

文章目錄 一、Excel在生產力提升中的作用二、Excel在創造價值方面的應用案例三、Excel實用技巧分享四、Excel與其他工具的協同應用五、Excel學習的建議與展望《Excel函數與公式應用大全》亮點內容簡介作者簡介目錄 在當今信息爆炸的時代&#xff0c;數據處理和分析能力已成為職…

AI智能分析網關V4智慧商場方案,打造智慧化商業管理生態

AI智能視頻檢測技術在商場樓宇管理中的應用越來越廣泛。通過實時監控、自動識別異常事件和智能預警&#xff0c;這項技術為商場管理提供了更高效、更安全的保障。今天我們以TSINGSEE青犀視頻AI智能分析網關為例&#xff0c;給大家介紹一下AI視頻智能分析技術如何應用在商場樓宇…

搶單情況下的均衡分配機制

背景&#xff1a; 1、工單有多種類型。 2、客戶提交工單。 3、不同客服受理不同類型工單&#xff0c;受理工單類型存在交叉。 4、按照類型維度實現均衡分配。 方案&#xff1a; 1、為每種類型創建一個工單池&#xff0c;使用隊列&#xff0c;左進右出&#xff1b;客戶提交…

Android AIDL RemoteCallbackLIst

RemoteCallbackLIst 參考地址 RemoteCallbackList 是 Android SDK 中的一個類&#xff0c;用于幫助管理進程之間的回調。它專為進程間通信 (IPC) 場景而設計&#xff0c;在該場景中&#xff0c;應用程序的不同部分甚至不同的應用程序可能在不同的進程中運行。 以下是其關鍵功能…

將所有字母轉化為該字母后的第三個字母,即A->D,B->E

//編寫加密程序&#xff0c;規則&#xff1a;將所有字母轉化為該字母后的第三個字母&#xff0c;即A->D,B->E,C->F,…Y->B,Z->C //小寫字母同上&#xff0c;其他字符不做轉化。輸入&#xff1a;I love 007 輸出&#xff1a;L oryh 007 代碼&#xff1a; #inc…

GVA快速使用

1. clone 代碼&#xff0c; 使用goland打開Server目錄&#xff0c; 使用vsc打開前端web目錄&#xff0c;運行后端&#xff0c;前端 gin-vue-admin后臺管理系統 - 知乎 (zhihu.com) 2.了解端口配置 參考&#xff0c; 基于Go的后臺管理框架Gin-vue-admin_go vue admin-CSDN博客…