【Luogu P5994】 [PA2014]Kuglarz
阿新 • • 發佈:2020-08-13
題目大意:
給定 \(N\) 個點,每個點可能有一個標記,可以通過 \(c_{i,j}\) 知道區間 \([i,j]\) 的奇偶性,問你至少需要花費多少,才能保證猜出哪些點有標記。
正文:
求導過程:
我做題時開始想的是通過知道兩個區間 \([l,r-1],[l,r]\) 的奇偶性直接得到 \(r\) 是否標記。而我們可以知道 \([0,r],[l,r]\) 得到 \([0,l-1]\) 的奇偶性,將區間作為樹的節點,每次給出 \([l,r]\) 的代價 \(w\) 時,連兩點 \([0,r],[0,l-1]\) 為一代價是 \(w\) 的線,即可最小生成樹。
程式碼:
int main() { scanf ("%d", &n); for (int i = 1; i <= n; i++) fa[i] = i; for (int i = 1; i <= n; ++i) { for (int j = i; j <= n; j++) { int w; scanf ("%d", &w); add(i - 1, j, w); } } sort(e + 1, e + 1 + tot, cmp); for (int i = 1; i <= tot ; i++) { int f = FIND(e[i].from), t = FIND(e[i].to); if (f == t) continue; fa[f] = t; ans += e[i].w * 1ll; } printf ("%lld", ans); return 0; }