--- title: "AtCoder Beginner Contest 238 E(並查集)" tags: 題解, 資料結構, 並查集 --- https://atcoder.jp/contests/abc238/tasks/abc238_e #### 題意 有一個長度 $N$ 的數組 $a_1, a_2, ..., a_N$,已知你可以得到 $Q$ 個區間的和,問是否能知道整個數組的和。 #### 思路 對於一個區間 $[L, R]$,如果我們得到 $pref[L - 1]$,則透過 $[L, R]$ 和 $pref[L - 1]$ 可以得到 $pref[R]$;同理,得到 $pref[R]$ 的話也可以得到 $pref[L - 1]$。因此,對於 $[L, R]$,得知 $pref[L - 1]$ 相當於得知 $pref[R]$,反之亦然。 我們處理每個區間時,將 $[L, R]$ 中的 $L - 1$ 和 $R$ 合併起來;最後看一下 $0$ 和 $N$ 是否有被合併起來即可,透過並查集可以做到。 #### Code ```python=1 def solve(): N, Q = map(int, input().split()) dsu = DSU(N + 1) for _ in range(Q): l, r = map(int, input().split()) dsu.union(l - 1, r) print("Yes" if dsu.same(0, N) else "No") if __name__ == "__main__": solve() ```