P4047 JSOI2010 部落劃分題解

2021-10-24 13:21:44 字數 2105 閱讀 6000

題意:給定一些點,要把這些點分為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...