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
- HDU 5046 Airport DLX
- HDU 5046 DLX
- hdu 5046 二分+DLX模板
- HDU 5046 Airport [DLX] [RepeatCover]
- HDU 5046 Airport(DLX重复覆盖)
- hdu 5046 airport DLX可重复覆盖
- HDU 5046 Airport【DLX重复覆盖】
- HDU 5046 Airport DLX多重覆盖
- HDU-5046 Airport(二分+DLX重复覆盖)
- HDU 2295 DLX 二分
- HDU 4735 DLX爆搜
- HDU 2828 DLX搜索
- HDU 2295 DLX
- hdu 3663 DLX
- hdu 2295 DLX+二分
- HDU 5046 ( Airport ) DLX模板题,手残again
- HDU 5046 Airport (DLX可重复覆盖+二分)
- HDU 5046 Airport(二分+DLX重复覆盖)
- FEDORA 20尝试了各种安装FCITX拼音的方法,只有一种是可行的
- jQuery Mobile移动开发
- Atitit. C# java 的api 目录封装结构映射总结
- leetcode-Subsets II
- leetcode-Jump Game
- HDU 5046 DLX
- 数论总结
- hdu 1011 树状dp。。
- c++输出缓冲区刷新
- 集合框架3:Set集合
- 居中没有宽度的元素
- 动态连通性算法分析总结
- HashMap和HashTable的区别
- linux inode理解