hdu6375 雙端佇列

2021-08-22 16:28:03 字數 1556 閱讀 3408

problem description

度度熊正在學習雙端佇列,他對其翻轉和合併產生了很大的興趣。

初始時有 n 個空的雙端佇列(編號為 1 到 n ),你要支援度度熊的 q 次操作。

①1 u w val 在編號為 u 的佇列裡加入乙個權值為 val 的元素。(w=0 表示加在最前面,w=1 表示加在最後面)。

②2 u w 詢問編號為 u 的佇列裡的某個元素並刪除它。( w=0 表示詢問並操作最前面的元素,w=1 表示最後面)

③3 u v w 把編號為 v 的佇列「接在」編號為 u 的佇列的最後面。w=0 表示順序接(佇列 v 的開頭和佇列 u 的結尾連在一起,佇列v 的結尾作為新佇列的結尾), w=1 表示逆序接(先將佇列 v 翻轉,再順序接在佇列 u 後面)。且該操作完成後,佇列 v 被清空。

input

有多組資料。

對於每一組資料,第一行讀入兩個數 n 和 q。

接下來有 q 行,每行 3~4 個數,意義如上。

n≤150000,q≤400000

1≤u,v≤n,0≤w≤1,1≤val≤100000

所有資料裡 q 的和不超過500000

output

對於每組資料的每乙個操作②,輸出一行表示答案。

注意,如果操作②的佇列是空的,就輸出-1−1且不執行刪除操作。

sample input

2 10

1 1 1 23

1 1 0 233

2 1 1

1 2 1 2333

1 2 1 23333

3 1 2 1

2 2 0

2 1 1

2 1 0

2 1 1

sample output

23

-12333

23323333

提示由於讀入過大,c/c++ 選手建議使用讀入優化。

乙個簡單的例子:

void read(int &x)

這題實際上非常的水啊= =,不明白為何這麼多人沒過,可能是沒有想到用map和deque吧。由於這題有15e4個雙向佇列,範圍非常大,用上map後可以避免mle,而且每組雙向佇列都是單獨操作的,所以我們用deque比較方便,畢竟deque自帶各種實用的函式。整個資料結構就是map>a;  關鍵值就是雙向佇列的編號,對映就是對應的雙向佇列啦。具體細節看**

#include#include#include#include#include#includeusing namespace std;

map>a;

void read(int &x)

int main()

if(b==2)

else

}else

cout<<-1<}

if(b==3)

if(e==1)}}

}return 0;

}

HDU 6375 雙端佇列

題意是有至多150000個雙端佇列,400000次簡單操作,直接開會導致記憶體超限,所以用 stl 中的 map 和 deque 而讀入過大已經在題目中有所說明,直接用已經給出的快速讀入即可。要注意的是在兩個佇列合併時,要用 insert 函式,直接乙個乙個操作會超時 自己對雙端佇列的 stl 還是...

度度熊學佇列 HDU 6375

度度熊正在學習雙端佇列,他對其翻轉和合併產生了很大的興趣。初始時有 nn 個空的雙端佇列 編號為 11 到 nn 你要支援度度熊的 qq 次操作。11 uu ww valval 在編號為 uu 的佇列裡加入乙個權值為 valval 的元素。w 0w 0 表示加在最前面,w 1w 1 表示加在最後面 ...

度度熊學佇列 HDU 6375

度度熊正在學習雙端佇列,他對其翻轉和合併產生了很大的興趣。初始時有 nn 個空的雙端佇列 編號為 11 到 nn 你要支援度度熊的 qq 次操作。11 uu ww valval 在編號為 uu 的佇列裡加入乙個權值為 valval 的元素。w 0w 0 表示加在最前面,w 1w 1 表示加在最後面 ...