題意:給定一些點,要把這些點分為k個部落,問最近兩個部落間的最遠距離是多少。
解法:二分答案+並查集檢測鴨!二分的時候要注意精度問題噢,eps開到1e-3會有乙個點過不去。開始看錯題意想半天。
**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
#define pi acos(-1)
#define eps 1e-4
#define rint register int
#define f(x) ((x)/3+((x)%3==1?0:tb))
#define g(x) ((x)using
namespace std;
typedef
long
long ll;
typedef pairint> pli;
typedef pair<
int,
int> pii;
typedef pair<
double
,int
> pdi;
typedef pair pll;
typedef pair<
double
,double
> pdd;
typedef map<
int,
int> mii;
typedef mapint> mli;
typedef map<
char
,int
> mci;
typedef mapint> msi;
template
<
class
t>
void
read
(t &res)
while
(c >=
'0'&& c <=
'9')
res *
= f;
}const
int ne[8]
[2]=
;const ll inf =
1e18
;const
int n =
1010
;const ll mod =
1e9+7;
const
int m =
110;
int n, k;
pdd p[n]
;double tu[n]
[n];
double
dis(pdd p1, pdd p2)
int f[n]
;int
find
(int x)
intcheck
(double x)
int cnt =0;
_rep(1
, n, i)
//cout << x << " " << cnt << endl;
return cnt >= k;
}int
main()
double l =
0, r = mx, mid, ans = mx;
while
(r-l>eps)
printf
("%.2lf\n"
, ans)
;return0;
}
P4047 JSOI2010 部落劃分
聰聰研究發現,荒島野人總是過著群居的生活,但是,並不是整個荒島上的所有野人都屬於同乙個部落,野人們總是拉幫結派形成屬於自己的部落,不同的部落之間則經常發生爭鬥。只是,這一切都成為謎團了 聰聰根本就不知道部落究竟是如何分布的。不過好訊息是,聰聰得到了乙份荒島的地圖。地圖上標註了n個野人居住的地點 可以...
洛谷 P4047 JSOI2010 部落劃分
這道題其實就是無線通訊網的雙倍經驗啦,只是在輸出的時候不同罷了。還是一樣的 kruskal 演算法,但是在求的時候,應該在 now n k 1 的時候結束。本來到 n k 就行了的,但是由於 n k 1 這條邊是在應該部落裡面的,不能算,所以要找到第乙個不在乙個部落裡面的邊。include usin...
P4047 JSOI2010 部落劃分 並查集
思路 並查集 生成樹 提交 2次 雖然樣例都沒過但感覺是對的 qwq 判邊少了一條 題解 把所有點之間連邊,然後 sort 一遍,從小往大加邊,直到連第 n k 1 條邊 相當於是破話 k 個連通塊的最短邊 記錄權值即為答案。include include include include inclu...