• hdu 2295 DLX


    思路:裸的DLX重复覆盖

    #include<set>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 51
    #define Maxm 80002
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-x))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define inf 1000000
    #define lowbit(x) (x&(-x))
    #define clr(x,y) memset(x,y,sizeof(x))
    #define Mod 1000000007
    using namespace std;
    int D[Maxn*Maxn],U[Maxn*Maxn],L[Maxn*Maxn],R[Maxn*Maxn],S[Maxn*Maxn],C[Maxn*Maxn],H[Maxn],id,K,n,m,cnt;
    bool vi[Maxn];
    struct Point{
        double x,y;
    }city[Maxn],rader[Maxn];
    double dis[Maxn][Maxn],edge[Maxn*Maxn];
    double Dis(Point a,Point b)
    {
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    void init(int m)
    {
        int i;
        for(i=0;i<=m;i++){
            D[i]=U[i]=i;
            L[i+1]=i;
            R[i]=i+1;
            S[i]=0;
        }
        R[m]=0;
        id=m+1;
    }
    void ins(int r, int c)
    {
        U[id] = c;
        D[id] = D[c];
        U[D[c]] = id;
        D[c] = id;
        if (H[r] < 0)
            H[r] = L[id] = R[id] = id;
        else
        {
            L[id] = H[r];
            R[id] = R[H[r]];
            L[R[H[r]]] = id;
            R[H[r]] = id;
        }
        S[c]++;
        C[id++] = c;
    }
    void Remove(int c)
    {
        int i;
        for(i=D[c];i!=c;i=D[i]){
            L[R[i]]=L[i];
            R[L[i]]=R[i];
        }
    }
    void Resume(int c)
    {
        int i;
        for(i=D[c];i!=c;i=D[i]){
            L[R[i]]=i;
            R[L[i]]=i;
        }
    }
    int A()
    {
        int i,j,k,ret=0;
        memset(vi,false,sizeof(vi));
        for(i=R[0];i;i=R[i]) if(!vi[i]){
            ret++;
            for(j=D[i];j!=i;j=D[j]){
                for(k=R[j];k!=j;k=R[k])
                    vi[C[k]]=true;
            }
        }
        return ret;
    }
    int dfs(int step)
    {
        if(step+A()>K) return false;
        if(R[0]==0) return true;
        int i,j,temp,c;
        temp=inf;
        for(i=R[0];i;i=R[i]) if(S[i]<temp){
            temp=S[i];
            c=i;
        }
        for(i=D[c];i!=c;i=D[i]){
            Remove(i);
            for(j=R[i];j!=i;j=R[j]){
                Remove(j);
            }
            if(dfs(step+1))
                return true;
            for(j=R[i];j!=i;j=R[j])
                Resume(j);
            Resume(i);
        }
        return false;
    }
    void build(int pos)
    {
        int i,j;
        init(n);
        for(i=1;i<=m;i++){
            H[i]=-1;
            for(j=1;j<=n;j++){
                if(dis[i][j]<=edge[pos])
                    ins(i,j);
            }
        }
    }
    void solve()
    {
        int i,j,l,r,mid;
        l=1,r=cnt;
        while(l<r){
            mid=(l+r)>>1;
            build(mid);
            if(dfs(0))
                r=mid;
            else
                l=mid+1;
        }
        printf("%.6lf
    ",edge[l]);
    }
    int main()
    {
        int t,i,j;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d%d",&n,&m,&K);
            for(i=1;i<=n;i++)
                scanf("%lf%lf",&city[i].x,&city[i].y);
            for(i=1;i<=m;i++)
                scanf("%lf%lf",&rader[i].x,&rader[i].y);
            cnt=0;
            for(i=1;i<=m;i++)
            for(j=1;j<=n;j++){
                dis[i][j]=Dis(rader[i],city[j]);
                edge[++cnt]=dis[i][j];
            }
            sort(edge+1,edge+1+cnt);
            int num=1;
            for(i=2;i<=cnt;i++) if(edge[i]!=edge[num]){
                edge[++num]=edge[i];
            }
            cnt=num;
            solve();
        }
        return 0;
    }
  • 相关阅读:
    CocosCreator-Widget,前后台切换
    Unity获取未激活游戏对象的方法 、坐标转换
    Mathf函数
    C# activeSelf、activeInHierarchy、SetActive、SetActiveRecursively
    C# 碰撞,射线,点击,周期函数等基本代码
    TCP/IP 协议栈
    笔记—《程序员自我修养》
    Container With Most Water 双指针法
    多线程服务器 编程模型
    c++ 高效并发编程
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3309601.html
Copyright © 2020-2023  润新知