現在有一種卡牌遊戲,每張卡牌上有三個屬性值:a,b,c。把卡牌分為x,y兩類,分別有n1,n2張。第一眼:二分圖水逼題!兩張卡牌能夠配對,當且僅當,存在至多一項屬性值使得兩張卡牌該項屬性值互質,且兩張卡牌類別不同。
比如一張x類卡牌屬性值分別是225,233,101,一張y類卡牌屬性值分別為115,466,99。那麼這兩張牌是可以配對的,因為只有101和99一組屬性互質。
遊戲的目的是最大化匹配上的卡牌組數,當然每張卡牌只能用一次。
資料第一行兩個數n1,n2,空格分割。
接下來n1行,每行3個數,依次表示每張x類卡牌的3項屬性值。
接下來n2行,每行3個數,依次表示每張y類卡牌的3項屬性值。
輸出乙個整數:最多能夠匹配的數目。
第二眼:哦,n
≤30000
n\leq 30000
n≤3000
0 啊,當我沒說……
考場上沒能想出來,考完後看到了分三類的神仙做法:
因為題目要求至多一種屬性值互質,轉化一下就是至少兩種屬性值不互質,也就是說只要有兩種屬性值不互質就好了。
那麼我們就分三種情況討論:兩張卡牌的 abab
ab兩種屬性值不互質、兩張卡牌的 acac
ac兩種屬性值不互質、兩張卡牌的 bcbc
bc兩種屬性值不互質。
然後看到值域是 [1,
200]
[1,200]
[1,200
],就考慮用值域建圖:先把 [1,
200]
[1,200]
[1,200
] 的所有質數預處理出來,有 46
4646
個。然後兩張卡牌的某種屬性值不互質的條件就是它們有至少乙個相同的質因數。假設現在討論的情況是 abab
ab,那麼我們就可以列舉 x 類的每一張卡牌 i
ii,然後列舉 i.a
i.ai.
a 的質因數 pri
mejprime_j
primej
,列舉 i.b
i.bi.
b 的質因數 pri
mekprime_k
primek
,讓左邊的 i
ii 向 (j,
k)(j,k)
(j,k
) 連邊。然後同理列舉 y 類的卡牌 i
ii,只不過是 (j,
k)(j,k)
(j,k
) 向右邊的 i
ii 連邊。
最後 s
ss 向左邊的每個 i
ii 連邊,右邊的每個 i
ii 向 t
tt 連邊,跑一邊最大流。
圖大概長這樣:
bzoj4205 卡牌配對
卡牌配對 題目背景 bzoj4205 分析 我相信很多人第一反應都是暴力連邊然後暴力二分圖匹配,然後我的常數還沒有小到n2過 30000 所以我們來想想該怎麼辦,考慮到 200以內的質數只有 46個,我們可以選擇增加 3 46 46 個點,將左邊的某種屬性有第 i個質因數,另乙個屬性有第 j個質因數...
BZOJ4205 卡牌配對
對於兩張卡牌,如果存在兩種屬性值不互質,則可以匹配。只考慮200以內的質數,一共有46個,可以新建3 46 46個點來表示一類屬性值中有這兩種質數的卡牌。然後對於每張卡牌,列舉它的質因子,最多只有3個,如此建圖求出最大流即可。includeconst int n 66500,inf 0u 2,p 2...
BZOJ4205 卡牌配對
現在有一種卡牌遊戲,每張卡牌上有三個屬性值 a,b,c。把卡牌分為x,y兩類,分別有n1,n2張。兩張卡牌能夠配對,當且僅當,存在至多一項屬性值使得兩張卡牌該項屬性值互質,且兩張卡牌類別不同。比如一張x類卡牌屬性值分別是225,233,101,一張y類卡牌屬性值分別為115,466,99。那麼這兩張...