2018百度之星(A)度度熊學佇列

2021-08-22 19:33:09 字數 1387 閱讀 9366

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

初始時有 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 且不執行刪除操作。

在這裡將雙端佇列一些常用操作說一下:

c.push_back(elem)在尾部加入乙個資料

c.push_front(elem)在頭部加入乙個資料

c.inset(pos,elem)在pos位置插入乙個elem拷貝,返回新資料位置

c.insert(pos,n,elem)在pos位置插入n個elem資料,無返回值

c.insert(pos,beg,end)在pos位置插入(beg,end)區間的資料,無返回值

c.pop_back()刪除最後乙個資料

c.pop_front()刪除頭部資料

c.front()返回第乙個資料

c.back()返回最後乙個資料

c.begin()返回指向第乙個資料的迭代器

c.end()返回指向最後乙個資料的下乙個位置的迭代器

c.rbegin()返回指向逆向佇列第乙個資料的迭代器

c.rend()返回指向逆向佇列的最後乙個資料的下乙個位置的迭代器

這個題使用雙端佇列進行各種操作即可,但因為資料過大,要用map。

#includeusing namespace std;

int n,q,u,v,w,val,num;

map>p;

void read(int &x)

int main()

else if(num==2)

else }}

else

else}}

}}

度度熊學佇列 2018百度之星初賽

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

2018百度之星(A)度度熊剪紙條

度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1 度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...

百度之星度度熊保護村莊

比賽的時候並沒有做出這道題。於是在賽後決定更正一下 把度度熊和它的夥伴們當成黑點,所有的村莊當成紅點 考慮對所有的黑點建圖 o n 暴力列舉所有的黑點點對,對於每個點對 a,b o n 檢測所有紅點 如果所有的紅點都在點對 a,b a b 的右側,則a到b連線一條長度為1的單向邊 如果所有的紅點都在...