二分+并查集【bzoj3007】[SDOI2012]拯救小云公主
Description
英雄又即將踏上拯救公主的道路……
這次的拯救目標是——愛和正義的小云公主。
英雄來到boss的洞穴門口,他一下子就懵了,因為面前不只是一只boss,而是上千只boss。當英雄意識到自己還是等級1的時候,他明白這就是一個不可能完成的任務。
但他不死心,他在想,能不能避開boss去拯救公主呢,嘻嘻。
Boss的洞穴可以看成一個矩形,英雄在左下角(1,1),公主在右上角(row,line)。英雄為了避開boss,當然是離boss距離越遠越好了,所以英雄決定找一條路徑使到距離boss的最短距離最遠。
Ps:英雄走的方向是任意的。
你可以幫幫他嗎?
當英雄找到了美麗漂亮的小云公主,立刻就被boss包圍了!!!英雄緩閉雙眼,舉手輕揮,白光一閃后使用了回城卷軸,回到了城堡,但只有小云公主回去了……因為英雄忘了進入回城的法陣了。
Input
第一行,輸入三個整數,n表示boss的數目,row,line表示矩形的大小;
接下來n行,每行分別兩個整數表示boss的位置坐標。
Output
輸出一個小數,表示英雄的路徑離boss的最遠距離,精確到小數點后兩位。
這里的距離指的是歐幾里德距離。
首先很容易看出是二分答案。
我們可以看成是以每個\(boss\)為圓心作一個半徑為\(r\)的圓,我們想要求的就是讓這些圓盡可能大,并且不能影響我們從\((1,1)\)到\((n,m)\)。(不能覆蓋)
直接考慮邊界條件\((n,1)\)和\((1,m)\)如果這兩個點沒有被覆蓋,那我必然可以到達\((n,m)\)
PS:這里的判斷條件不是同時判斷。
這樣用\(||\)判斷,可以達到我們邊界不被封鎖的情況。
用并查集維護連通即可。
代碼
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #define eps 1e-4 #define R registerusing namespace std;const int gz=3e3+8;inline void in(R int &x) {R int f=1;x=0;char s=getchar();while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}while(isdigit(s)){x=x*10+s-'0';s=getchar();}x*=f; }int nn,n,m,f[gz];struct cod {int x,y; }bos[gz];int find(R int x){return f[x]==x?x:f[x]=find(f[x]);}inline double xx(R double x) {return x*x; }inline double dis(R int i,R int j) {return xx(bos[i].x-bos[j].x)+xx(bos[i].y-bos[j].y); }inline bool ok(R double r) {for(R int i=0;i<=nn+1;i++)f[i]=i;for(R int i=1;i<=nn;i++){for(R int j=1;j<i;j++){if(dis(i,j)<=xx(2*r)){R int fa=find(i),fb=find(j);if(fa!=fb)f[fa]=fb;}}if(bos[i].x-r<=1 or bos[i].y+r>=m){R int fa=find(i),fb=find(0);if(fa!=fb)f[fa]=fb;}if(bos[i].x+r>=n or bos[i].y-r<=1){R int fa=find(i),fb=find(nn+1);if(fa!=fb)f[fa]=fb;}}return find(0)!=find(nn+1); }int main() {in(nn),in(n),in(m);for(R int i=1;i<=nn;i++)in(bos[i].x),in(bos[i].y);R double ll=0,rr=min(n,m);while(fabs(ll-rr)>eps){R double mid=(ll+rr)/2;if(ok(mid))ll=mid;else rr=mid;}printf("%.2f",ll); }轉載于:https://www.cnblogs.com/-guz/p/9975749.html
總結
以上是生活随笔為你收集整理的二分+并查集【bzoj3007】[SDOI2012]拯救小云公主的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Struts2的通配方法、转发重定向
- 下一篇: [Swift]LeetCode944.