hdu2295(DLX重复覆盖)
来源:互联网 发布:linux如何修改用户组 编辑:程序博客网 时间:2024/05/21 14:41
很容易想到,二分答案。
每次根据半径建好0,1矩阵。
然后就是DLX可重复覆盖的模板
#include<cstdio>#include<cstring>#include<cmath>double x[55],y[55],X[55],Y[55];const int MN=1005;const int MM=1005;const int MNN=1e5+5+MM; //最大点数const double eps = 1e-9;int n,m,k;struct DLX{ int n,m,size; int U[MM],D[MM],R[MM],L[MM],Row[MM],Col[MM]; int H[MM],S[MM]; int ands,ans[MM]; void init(int _n,int _m) { n = _n; m = _m; for(int i = 0;i <= m;i++) { S[i] = 0; U[i] = D[i] = i; L[i] = i-1; R[i] = i+1; } R[m] = 0; L[0] = m; size = m; for(int i = 1;i <= n;i++) H[i] = -1; } void Link(int r,int c) { ++S[Col[++size]=c]; Row[size] = r; 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; } } void remove(int c) { for(int i = D[c];i != c;i = D[i]) L[R[i]] = L[i], R[L[i]] = R[i]; } void resume(int c) { for(int i = U[c];i != c;i = U[i]) L[R[i]]=R[L[i]]=i; } bool v[MM]; int f() { int ret = 0; for(int c = R[0];c != 0;c = R[c])v[c] = true; for(int c = R[0];c != 0;c = R[c]) if(v[c]) { ret++; v[c] = false; for(int i = D[c];i != c;i = D[i]) for(int j = R[i];j != i;j = R[j]) v[Col[j]] = false; } return ret; } bool Dance(int d) { if(d + f() > k)return false; if(R[0] == 0)return d <= k; int c = R[0]; for(int i = R[0];i != 0;i = R[i]) if(S[i] < S[c]) c = i; for(int i = D[c];i != c;i = D[i]) { remove(i); for(int j = R[i];j != i;j = R[j])remove(j); if(Dance(d+1))return true; for(int j = L[i];j != i;j = L[j])resume(j); resume(i); } return false; }}dlx;double cla(int a,int b){ return sqrt((X[a]-x[b])*(X[a]-x[b])+(Y[a]-y[b])*(Y[a]-y[b]));}bool check(double mid){ dlx.init(m,n); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(cla(i,j)-mid<=eps) dlx.Link(i,j); } } dlx.ands = -1; if(dlx.Dance(0)) return true; return false;}int main(){ int cases; scanf("%d",&cases); while(cases--) { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); for(int i=1;i<=m;i++) scanf("%lf%lf",&X[i],&Y[i]); double l = 0,r = 10000000,mid; for(int i=0;i<100;i++) { mid = (l+r)/2; bool flag = check(mid); //printf("%f %d\n",mid,flag); if(flag) r = mid-eps; else l = mid+eps; } printf("%.6lf\n",r); } return 0;}
阅读全文
0 0
- hdu2295(DLX重复覆盖)
- hdu2295 Radar 二分+DLX重复覆盖+A*
- DLX+hdu2295
- HDU2295 Radar(舞蹈链重复覆盖,二分)
- HDU 2295 Radar(重复覆盖,DLX)
- hdu - 3498 - whosyourdaddy(重复覆盖DLX)
- HDU 5046 Airport(DLX重复覆盖)
- HDU 2828 Lamp(DLX重复覆盖)
- POJ1084-重复覆盖,DLX
- DLX 精确覆盖 重复覆盖
- DLX hdu2295 Radar
- DLX (精确区间覆盖,重复区间覆盖)(模板)
- 最新版dlx模板(精确覆盖+重复覆盖)
- HDU 3656 DLX重复覆盖
- hdu3957Street Fighter(DLX重复覆盖)
- HDU 3498 DLX 重复覆盖
- hdu 2295 DLX重复覆盖
- 可重复覆盖的DLX
- webapp屏幕适配
- 【数据结构】链表的原理及与其相关的常见面试题总结
- 短实训-数据库基础(三)
- 认识UART接口
- 今日头条一个身份证可以注册几个头条号
- hdu2295(DLX重复覆盖)
- ios::sync_with_stdio(false);
- python通过thrift实现向flume发送数据
- AP聚类算法原理
- 后缀表达式
- 浅谈Redis---(2)
- Android Studio live template巧用动态模板也能大大提高你的开发效率
- 关于MySQL 触发器的使用
- 【theano-windows】学习笔记七——logistic回归