2018百度之星初賽 A 1002

2021-08-22 18:10:14 字數 1267 閱讀 8860

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

初始時有 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 被清空。

有多組資料。

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

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

n≤150000,q≤400000

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

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

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

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

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

23 -1

2333

233

23333

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

乙個簡單的例子:

void read(int &x)

傳送門

由於n很大,單用deque會mle,因此用map和deque就可以過了~

#include

#include

#include

#include

#include

using

namespace

std;

void read(int &x)

map >mp;

int main()

else

if(x==2)

else

cout

cout

<<"-1"}}

return

0;}

2018百度之星初賽1003

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

百度之星2018初賽A輪

題目描述 題解 簽到題。排個序列舉小的兩條然後二分出第三條就好了。其實排序之後只要看連續的三條就行了。include define n 1005 using namespace std int n,s n ans int main printf d n ans return 0 題解 當時腦子抽了寫...

2018 「百度之星」程式設計大賽 初賽(A)

第二題還算手穩 手快?最後勉強擠進前五百 期間看著自己從兩百多掉到494名 1001 度度熊拼三角 hdoj 6374 簽到題 題意 給n根木棒 求可以拼出的周長最長的三角形 可以用貪心的思想做 對所有的木棒長度進行排序 取最長的三根進行判斷是否可以組成三角形 若不能 捨去最長的一根 每次都選擇相鄰...