acm.hdu.edu.cn/showproblem.php?pid=6109
給出若干個條件:xi
=xj 或 xi
≠xj ,它們分屬若干組,但組與組之間的分隔符沒了,要重新分隔這幾組條件。
每一組條件的特點是:不可能成立,但去掉最後乙個條件後,就可以成立。
每次都貪心地常試將盡量多的條件放進當前這組,遇到第乙個與已有條件衝突時,就是分隔的時候。
相等有傳遞性,用並查集維護;不等沒有傳遞性,用 set 維護。
注意到:若x1
=x2,
x1≠x
3,x2
≠x4 ,那麼有:x1
≠x4,
x2≠x
3 。所以在用並查集將 x1
、x2 合併時(比如將x1
合併到x2
),就要將x1
的不相等的資訊合併到x2
上。
#include
#include
using
namespace
std;
const
int n = 100000;
set st[n+1];
int fa[n+1], rk[n+1];
void clear(int n)
}void pushup(int x, int y)
int root(int x)
void unite(int x, int y)
}int ans[n];
int main()
else
unite(x, y);
}else
else}}
printf("%d\n", top);
for(int i = 0; i < top; ++i)
printf("%d\n", ans[i]);
return
0;}
HDU 6109 資料分割 並查集 啟發式合併
題目鏈結 略對於相等的關係很好維護,關鍵是對於不想等的關係。如果 x i 與 x j 不相等,那麼 x i 所在集合中的所有點都是和 x j 所在集合中的所有點不相等的。把不相等的 x i 與 x j 所在集合的代表結點建一條邊,如果 x i 所在集合要和其他集合合併,那麼在合併的時候指向被合併集合...
hdu 5047平面分割
題目大意 給n條樣子像 m 的折線,求它們能把二維平面分成的面最多是多少。解題思路 我們發現直線1條 2平面 2直線 4平面 3直線 7平面.因為第n條直線要與前面n 1條直線都相交,才能使分的平面最多,則新增第n條直線,平面增加n個 所以公式是面f 2 2 3 n 1 n n 2 1 因為題目的是...
HDU 折線分割平面 遞推
折現分割平面 problem description 我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。input 輸入資料的第一行是乙個整數c,表示測試例項的個數...