HDU3656 Fire Station Dancing Links

來源:互聯網
上載者:User

這題Dancing Links寫的好糾結,二分寫掛了一次。

這題的思路是預先處理出所有點對的距離,然後進行對半徑二分,跑重複覆蓋即可。

注意二分的時候不能對距離二分,那樣會逾時,我們考慮極限情況,也就是消防隊恰好可以到達某一房子,也就是距離相等時的情況,這樣,我們就維護一個que數組表示可以選到的距離,對此進行二分。

 

My Code:

#include <cstdio><br />#include <cstring><br />#include <cstdlib><br />#include <cmath><br />#include <algorithm><br />using namespace std;<br />const int oo=0x3f3f3f3f;<br />const int MAX=120;<br />const int head=0;<br />int up[MAX*MAX],down[MAX*MAX],left[MAX*MAX],right[MAX*MAX];<br />int cnt[MAX],h[MAX],col[MAX*MAX];<br />int K,ans;<br />int nc;<br />void remove(const int& c){<br />for(int i=down[c];i!=c;i=down[i]){<br />left[right[i]]=left[i];<br />right[left[i]]=right[i];<br />cnt[col[i]]--;<br />}<br />}<br />void resume(const int& c){<br />for(int i=up[c];i!=c;i=up[i]){<br />left[right[i]]=i;<br />right[left[i]]=i;<br />cnt[col[i]]++;<br />}<br />}<br />int evalute(){<br />bool vis[MAX]={0};<br />int ret=0;</p><p>for(int i=right[head];i!=head;i=right[i]){<br />if(!vis[i]){<br />ret++;<br />vis[i]=true;<br />for(int j=down[i];j!=i;j=down[j]){<br />for(int k=right[j];k!=j;k=right[k]){<br />vis[col[k]]=true;<br />}<br />}<br />}<br />}</p><p>return ret;<br />}<br />bool dfs(const int& k){<br />if(k+evalute()>ans){<br />return false;<br />}<br />if(right[head]==head){<br />return true;<br />}</p><p>int s=oo,c=0;<br />for(int i=right[head];i!=head;i=right[i]){<br />if(cnt[i]<s){<br />s=cnt[i];<br />c=i;<br />if(cnt[i]<=1){<br />break;<br />}<br />}<br />}</p><p>for(int i=down[c];i!=c;i=down[i]){<br />remove(i);<br />for(int j=right[i];j!=i;j=right[j]){<br />remove(j);<br />}<br />if(dfs(k+1)){<br />return true;<br />}<br />for(int j=left[i];j!=i;j=left[j]){<br />resume(j);<br />}<br />resume(i);<br />}</p><p>return false;<br />}<br />void init(){<br />for(int i=0;i<=nc;i++){<br />h[i]=-1;<br />left[i]=i-1;<br />right[i]=i+1;<br />up[i]=down[i]=i;<br />cnt[i]=0;<br />col[i]=i;<br />}<br />left[head]=nc;<br />right[nc]=head;<br />K=nc;<br />for(int i=1;i<=nc;i++){<br />h[i]=-1;<br />}<br />}<br />void add(const int& r,const int& c){<br />K++;<br />col[K]=c;<br />up[K]=c;<br />down[K]=down[c];<br />if(h[r]==-1){<br />h[r]=right[K]=K;<br />}<br />left[K]=h[r];<br />right[K]=right[h[r]];<br />left[right[K]]=K;<br />right[left[K]]=K;<br />up[down[K]]=K;<br />down[up[K]]=K;<br />}<br />struct Node{<br />int x,y;<br />}city[MAX];<br />int dis[MAX][MAX];<br />int que[MAX*MAX],top;<br />int sqr(int x){<br />return x*x;<br />}<br />int operator*(const Node& a,const Node& b){<br />return sqr(a.x-b.x)+sqr(a.y-b.y);<br />}<br />void build(const int& mid){<br />init();<br />for(int i=1;i<=nc;i++){<br />for(int j=1;j<=nc;j++){<br />if(dis[i][j]<=mid){<br />add(i,j);<br />}<br />}<br />}<br />}<br />void run(){<br />int l=0,r=top;<br />int mid,ans;</p><p>while(l<=r){<br />mid=(l+r)/2;<br />build(que[mid]);<br />if(dfs(0)){<br />ans=que[mid];<br />r=mid-1;<br />}else{<br />l=mid+1;<br />}<br />}</p><p>printf("%.6f/n",sqrt((double)ans));<br />}<br />int main(){<br />int T;</p><p>scanf("%d",&T);<br />while(T--){<br />scanf("%d%d",&nc,&ans);<br />for(int i=1;i<=nc;i++){<br />scanf("%d%d",&city[i].x,&city[i].y);<br />}<br />top=0;<br />//here we deal with the distance between city and city.<br />for(int i=1;i<=nc;i++){<br />for(int j=1;j<=nc;j++){<br />que[top++]=dis[i][j]=city[i]*city[j];<br />}<br />}<br />int tmp=top;<br />sort(que,que+top);<br />top=1;<br />for(int i=1;i<tmp;i++){<br />if(que[i]!=que[i-1]){<br />que[top++]=que[i];<br />}<br />}<br />run();<br />}</p><p>return 0;<br />}<br />

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.