Luogu1197 JSOI2008 星球大戰

2021-08-21 10:37:24 字數 1253 閱讀 4341

並查集水過。。。

想必順著題意只能暴力了,因為涉及到拆點很麻煩

所以我們反著來(笑)

仔細想想,反著來不就是建點了嗎///233

於是並查集判斷聯通塊,ok大功告成

eg:那個資料範圍是真的坑!!!

1 <= n <= 2m 硬生生看成 1 <= m <= 2n

60分re了半天...

#include

#include

const

int maxn =

400001

;//n <= 2m!!!

int fir[maxn]

, nxt[maxn <<1]

, to[maxn <<1]

, from[maxn <<1]

, cnt;

int fa[maxn]

, goal[maxn]

, tot, ans[maxn]

;bool flag[maxn]

;inline

intread()

return k;

}inline

void

add_edge

(int a,

int b)

intget

(int t)

inline

bool

connect

(int a,

int b)

}int

main()

for(

int i =

1; i <= m; i++

)int k =

read()

; tot = n - k;

for(

int i =

1; i <= k; i++

)for

(int i =

0; i < m; i++)

ans[k]

= tot;

for(

int j = k; j >=

1; j--

) ans[j -1]

= tot;

//注意,修好第j個被破壞的,得出結果是第j-1次後剩下的聯通塊個數

}for

(int i =

0; i <= k; i++

)printf

("%d\n"

, ans[i]);

return0;

}

Luogu1197 星球大戰

題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治著整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...

P1197 JSOI2008 星球大戰

思路和關閉農場差不多,不過加了一些時間上的優化。當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它相連的點如果在圖中但是與它不在乙個聯通塊中,那麼就將其合併,連通塊個數減一。注 並查集的題果斷找祖宗。include include include include define n 4...

P1197 JSOI2008 星球大戰

題目 p1197 jsoi2008 星球大戰 分析 看完題目,第一眼就是想到,我們反過來不斷把新的邊加入,然後利用陣列儲存答案,最後逆序輸出。num 陣列用來給破壞的星球編號 從大到小 為什麼要編號呢?因為後面 sort 排序是根據這個編號來的。預處理時,我們以兩個星球中 x,y 最大值作為該邊的編...