1. 程式人生 > 其它 >Atcoder ABC(170) E 題題解

Atcoder ABC(170) E 題題解

1.題意

自己 yy 的題意

有許多個幼兒園,有 \(N\) 個小朋友就讀其中。每個小朋友有一個搗蛋值,一個幼兒園的搗蛋值為這個幼兒園裡搗蛋值最大的小朋友,有一天, \(jw\) 來抽查這些學校,為了給 \(jw\) 留下好印象,這幾所幼兒園的校長將推舉出一所搗蛋值最小的幼兒園讓 \(jw\) 去參觀。可是小朋友們太搗蛋了,他們可能會從 C 幼兒園轉到 D 幼兒園。每當一個小朋友轉校,校長們就會去算 \(jw\) 將看到的搗蛋值,但小朋友們太搗蛋了,校長們光是管理就已經 玩不轉了 忙的不可開交,於是他們把這個任務交給了你。

一句話題意

給你 \(2 * 10^5\) 個集合,\(i\) 集合內元素的最大值記作 \(val[i]\)

,第 \(i\) 次操作將 \(C_i\) 號元素轉移到 \(D_i\),並詢問所有非空集合的 \(val[i]\) 的最小值

2.題解

法一 優先佇列+懶惰標記

將每一個集合用大根堆(p1)來儲存,再將 \(val_i\) 用小根堆(p2)儲存。
將每一個操作分成6步走:
1.在 \(p2\) 中刪除 \(val[id[c]]\) (\(id[x]\) 表示目前 \(x\) 號小朋友在哪個集合)
2.刪除 \(p1[id[c]]\) 中的小朋友 \(c\)
3.在 \(p2\) 中加入 \(val[id[c]]\)
4.在 \(p2\) 中刪除 \(val[id[d]]\)
5.在 \(p1[d]\)

中加入 \(c\) 號小朋友。
6.在 \(p2\) 中加入 \(val[id[d]]\)
新增操作非常好寫,直接丟進去就可以了。