HDU 5046 DLX

来源:互联网 发布:网络歌手曹菲儿 编辑:程序博客网 时间:2024/06/08 20:01


二分距离

typedef long long LL ;LL   Abs(LL x){ return x >= 0 ? x : -x ; }const int N = 62;const int M = 100100;struct DLX{    int U[M],D[M],L[M],R[M],C[M],X[M];    int H[N],S[N],Q[N];    int size;    void remove(const int& c){ //删c列        for(int i = D[c] ; i != c ; i = D[i]){            R[L[i]] = R[i];            L[R[i]] = L[i];        }    }    void resume(const int& c){  //恢复c列        for(int i = U[c] ; i != c ; i = U[i]){            R[L[i]]=i;            L[R[i]]=i;        }    }    int h(){ //估价        int  t=0;        bool vis[N];        memset(vis, 0 , sizeof(vis));        for(int i = R[0] ; i ; i = R[i]){            if(vis[i])continue;            t++;            vis[i] = 1 ;            for(int j = D[i] ; j != i ; j = D[j])                for (int k = R[j] ; k != j ; k = R[k])                    vis[C[k]] = 1 ;        }        return t;    }    int  ret , limit ;    void dfs(const int& k){        int least = h();        if(!R[0] || k + least >= ret || k + least > limit){            if(!R[0])  ret = std::min(ret , k) ;            return ;        }        int c ;        for(int maxt = M , i = R[0] ; i ; i = R[i]){            if(S[i] < maxt){                maxt = S[c = i] ;            }        }        for(int i = D[c] ; i != c ; i=D[i]){            Q[k] = i ; // 记录            remove(i);            for(int j = R[i] ; j != i ; j = R[j]){                remove(j);            }            dfs(k+1) ;            for(int j = L[i] ; j != i ; j = L[j]){                resume(j);            }            resume(i);        }    }    void update(const int& r,const int& c){        ++S[C[size] = c];        D[size] = D[c];        U[D[c]] = size;        U[size] = c;        D[c] = size;        if(H[r]<0) H[r] = L[size] = R[size] = size;        else{            R[size] = R[H[r]];            L[R[H[r]]] = size;            L[size] = H[r];            R[H[r]] = size;        }        X[size++] = r;    }    void init(int col){        for(int i = 0 ; i <= col ; i++){            S[i] = 0;            D[i] = U[i] = i;            L[i+1] = i;            R[i] = i+1;        }        R[col] = 0;        size = col + 1;        memset(H,-1,sizeof(H));        ret = M  ;    }};DLX dlx  ;int  n , k ;LL   dx[N] , dy[N] ;LL   a[N*N]  , dist[N][N] ;int  m ;int   ok(LL d){      dlx.init(n) ;      dlx.limit = k ;      for(int i = 1 ; i <= n ; i++){          for(int j = 1 ; j <= n ; j++){               if(dist[i][j] <= d) dlx.update(i , j) ;          }      }      dlx.dfs(0) ;      return dlx.ret <= k ;}LL    bs(){      int l = 0 , r = m - 1 , mid , s  ;      while(l <= r){           mid = (l + r) >> 1 ;           if(ok(a[mid])){               s = mid ;               r = mid - 1 ;           }           else  l = mid + 1 ;      }      return a[s] ;}int   main(){      int t  , T = 1 , i  , j  ;      cin>>t ;      while(t--){           scanf("%d%d" , &n , &k) ;           for(i = 1 ; i <= n ; i++) scanf("%I64d%I64d" , &dx[i] , &dy[i]) ;           m = 0 ;           for(i = 1 ; i <= n ; i++){               for(j = 1 ; j <= n ; j++)                   a[m++] = dist[i][j] = dist[j][i] =  Abs(dx[i] - dx[j]) + Abs(dy[i] - dy[j]) ;           }           sort(a , a+m) ;           m = unique(a , a+m) - a ;           printf("Case #%d: %I64d\n" , T++ , bs()) ;      }      return 0 ;}



0 0
原创粉丝点击