HDU 2295 Radar(二分+重复覆盖)
来源:互联网 发布:电视连接网络 编辑:程序博客网 时间:2024/06/05 17:09
题意:
重复覆盖经典题目,然而要浮点数二分答案,精度是个坑- -浮点数二分和整数二分还是有点不同的。我的代码跑的可能有点慢,应该是模板的关系。
代码:
//// Created by CQU_CST_WuErli// Copyright (c) 2016 CQU_CST_WuErli. All rights reserved.//#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#include <cctype>#include <cmath>#include <string>#include <vector>#include <list>#include <map>#include <queue>#include <stack>#include <set>#include <algorithm>#include <sstream>#include <ctime>#define CLR(x) memset(x,0,sizeof(x))#define OFF(x) memset(x,-1,sizeof(x))#define MEM(x,a) memset((x),(a),sizeof(x))#define BUG cout << "I am here" << endl#define lookln(x) cout << #x << "=" << x << endl#define SI(a) scanf("%d",&a)#define SII(a,b) scanf("%d%d",&a,&b)#define SIII(a,b,c) scanf("%d%d%d",&a,&b,&c)#define rep(flag,start,end) for(int flag=start;flag<=end;flag++)#define Rep(flag,start,end) for(int flag=start;flag>=end;flag--)#define Lson l,mid,rt<<1#define Rson mid+1,r,rt<<1|1#define Root 1,n,1#define BigInteger bignconst int MAX_L=2005;// For BigIntegerconst int INF_INT=0x3f3f3f3f;const long long INF_LL=0x7fffffff;const int MOD=1e9+7;const double eps=1e-8;const double pi=acos(-1);typedef long long ll;using namespace std;double mid;int n,m,k;struct P{ double x,y; P(){} P(double x,double y):x(x),y(y){} bool operator < (const P& rhs) const { return x==rhs.x?y<rhs.y:x<rhs.x; }}city[60],radar[60];double dis(P& a,P& b){ double dx=a.x-b.x; double dy=a.y-b.y; return sqrt(dx*dx+dy*dy);}struct DLX { const static int maxn=1000010; int L[maxn],R[maxn],U[maxn],D[maxn]; int Row[maxn],Col[maxn]; int H[maxn],S[maxn]; int vis[100]; int ans; int size; stack<int> Ans; void init(int m) { for (int i=0;i<=m;i++) { U[i]=D[i]=i; L[i]=i-1;R[i]=i+1; S[i]=0; } L[0]=m;R[m]=0; for (int i=0;i<maxn;i++) H[i]=-1; size=m; ans=-1; while (Ans.size()) Ans.pop(); } void link(int row,int col) { size++; Col[size]=col;Row[size]=row; S[col]++; U[size]=U[col];D[size]=col; D[U[col]]=size; U[col]=size; if (H[row]!=-1) { R[size]=H[row]; L[size]=L[H[row]]; R[L[size]]=size; L[R[size]]=size; } else H[row]=L[size]=R[size]=size; } // exact cover void remove(int c) { L[R[c]]=L[c]; R[L[c]]=R[c]; for (int i=D[c];i!=c;i=D[i]) { for (int j=R[i];j!=i;j=R[j]) { U[D[j]]=U[j]; D[U[j]]=D[j]; S[Col[j]]--; } } } void resume(int c) { for (int i=U[c];i!=c;i=U[i]) { for (int j=L[i];j!=i;j=L[j]) { U[D[j]]=j; D[U[j]]=j; S[Col[j]]++; } } R[L[c]]=c; L[R[c]]=c; } bool dfs(int cnt) { if (ans!=-1) return true; if (R[0]==0) { ans=cnt; return true; } int c=0; int Min=INF_INT; for (int i=R[0];i!=0;i=R[i]){ if (Min>S[i]) Min=S[i],c=i; // lookln(i); } remove(c); for (int i=D[c];i!=c;i=D[i]) { Ans.push(Row[i]); for (int j=R[i];j!=i;j=R[j]) { remove(Col[j]); } if (dfs(cnt+1)) return true; for (int j=L[i];j!=i;j=L[j]) { resume(Col[j]); } Ans.pop(); } resume(c); return false; } // exact cover ends; // multiple cover void del(int c) { for (int i=D[c];i!=c;i=D[i]) { L[R[i]]=L[i]; R[L[i]]=R[i]; } } void rec(int c) { for (int i=U[c];i!=c;i=U[i]) { L[R[i]]=R[L[i]]=i; } } int h() { int ret=0; CLR(vis); for (int i=R[0];i!=0;i=R[i]) if (!vis[i]) { ret++; vis[i]=1; for (int j=D[i];j!=i;j=D[j]) for (int k=R[j];k!=j;k=R[k]) vis[Col[k]]=1; } return ret; } bool DFS(int cnt) { if (cnt>k) return false; if (cnt+h()>k) return false; if (R[0]==0) { // lookln(mid); return true; } int c=0; int Min=INF_INT; for (int i=R[0];i!=0;i=R[i]) if (Min>S[i]) Min=S[i],c=i; // lookln(c); for (int i=D[c];i!=c;i=D[i]) { del(i); for (int j=R[i];j!=i;j=R[j]) del(j); if (DFS(cnt+1)) return true; for (int j=L[i];j!=i;j=L[j]) rec(j); rec(i); } return false; } // multiple cover ends;}dlx;int main(int argc, char const *argv[]) {#ifdef LOCAL freopen("C:\\Users\\john\\Desktop\\in.txt","r",stdin); // freopen("C:\\Users\\john\\Desktop\\out.txt","w",stdout);#endif int T;SI(T); while(T--) { SIII(n,m,k); rep(i,1,n) scanf("%lf%lf",&city[i].x,&city[i].y); rep(i,1,m) scanf("%lf%lf",&radar[i].x,&radar[i].y); double L=0.00,R=0.00; rep(i,1,m) rep(j,1,n) R=max(R,dis(city[j],radar[i])); // lookln(R); while (R-L>eps) { mid=(L+R)/2; // lookln(mid); dlx.init(n); rep(i,1,m) rep(j,1,n) { if (dis(radar[i],city[j])<=mid) dlx.link(i,j); } if (dlx.DFS(0)) R=mid; else L=mid; // if (mid==2.5) break; } printf("%.6lf\n",(L+R)/2); // lookln(dlx.size); } return 0;}
0 0
- HDU 2295 Radar(二分+重复覆盖)
- hdu 2295 Radar(重复覆盖,二分+DLX)
- 【HDU】2295 Radar 二分+重复覆盖
- HDU 2295 Radar (二分+DLX,重复覆盖)
- [ACM] HDU 2295 Radar (二分+DLX 重复覆盖)
- [ACM] HDU 2295 Radar (二分+DLX 重复覆盖)
- HDU 2295 Radar (DLX可重复覆盖+二分)
- HDU 2295 Radar(二分+DLX重复覆盖)
- HDU 2295 Radar(重复覆盖,DLX)
- hdu 2295 Radar(重复覆盖问题)
- HDU 2295 Radar【二分+Dancing Links重复覆盖】
- HDU 2295 Radar( 二分+Dancing Links重复覆盖 )
- HDU 2295 Radar(DLX可重复覆盖)
- hdu 2295 Radar(Dancing Links重复覆盖)
- HDU 2295 Radar(重复覆盖|Dancing Links)
- HDU 2295 Radar DLX重复覆盖
- HDU 2295 Radar DLX重复覆盖
- [HDU]2295 Radar 跳舞链 重复覆盖
- 经典的Java基础面试题集锦汇总
- javascript数组 添加元素
- UEditor 报错:Uncaught ReferenceError: UE is not defined; Uncaught ReferenceError: UM is not defined
- 作为程序员在公司不要与和同事说的几个要点
- HttpClient 教程 (一)
- HDU 2295 Radar(二分+重复覆盖)
- 使用导航控制器的笔记
- D2
- JAVA SE 学习笔记
- 为什么数据分析师要用产品思维?
- 个人总结(2.24)
- 【CSS3】调用动画
- 深度学习:能击败欧洲围棋冠军,还能防恶意软件
- python学习之11 加密解密hashlib