DLX重复覆盖 hdu5046 Airport_逍遥丶綦的博客-程序员秘密

技术标签: ACM_DLX  

传送门:点击打开链接

题意:有N个城市,现在要修K个机场,使N个城市到最近机场的最大距离最小,问K个机场应该修在哪里,机场必须修在城市中。

思路:二分N个城市到最近机场的最大距离,于是可以转换成,知道每个点,知道它的半径,能覆盖到这些点,问是否能选K个点,使得所在范围覆盖所有的点。那么这部分可以用DLX重复覆盖来做

wa点:二分的时候,l,m,r都要使用LL才行,因为可能会爆int

#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define fuck printf("fuck")
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;

const int MX = 60 + 5;
const int MN = 3600 + 5;
const int INF = 0x3f3f3f3f;

struct DLX {
    int m, n, ans;
    int H[MX], S[MX], vis[MX];
    int Row[MN], Col[MN], rear;
    int L[MN], R[MN], U[MN], D[MN];

    void Init(int _m, int _n) {
        m = _m; n = _n;
        rear = n; ans = INF;
        for(int i = 0; i <= n; i++) {
            S[i] = 0;
            L[i] = i - 1;
            R[i] = i + 1;
            U[i] = D[i] = i;
        }
        L[0] = n; R[n] = 0;
        for(int i = 1; i <= m; i++) {
            H[i] = -1;
        }
    }

    void Link(int r, int c) {
        int rt = ++rear;
        Row[rt] = r; Col[rt] = c; S[c]++;

        D[rt] = D[c]; U[D[c]] = rt;
        U[rt] = c; D[c] = rt;
        if(H[r] == -1) {
            H[r] = L[rt] = R[rt] = rt;
        } else {
            int id = H[r];
            R[rt] = R[id]; L[R[id]] = rt;
            L[rt] = id; R[id] = rt;
        }
    }

    void Remove(int c) {
        for(int i = D[c]; i != c; i = D[i]) {
            R[L[i]] = R[i]; L[R[i]] = L[i];
        }
    }

    void Resume(int c) {
        for(int i = U[c]; i != c; i = U[i]) {
            R[L[i]] = L[R[i]] = i;
        }
    }

    int h() {
        int ret = 0;
        memset(vis, 0, sizeof(vis));
        for(int c = R[0]; c != 0; c = R[c]) {
            if(!vis[c]) {
                ret++;
                vis[c] = 1;
                for(int i = D[c]; i != c; i = D[i]) {
                    for(int j = R[i]; j != i; j = R[j]) {
                        vis[Col[j]] = 1;
                    }
                }
            }
        }
        return ret;
    }

    bool Dance(int cnt, int K) {
        if(cnt + h() > K) return false;
        if(R[0] == 0) return true;

        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(cnt + 1, K)) return true;
            for(int j = L[i]; j != i; j = L[j]) Resume(j);
            Resume(i);
        }
        return false;
    }
} G;

LL X[MX], Y[MX], W[MX][MX];

LL dist(int i, int j) {
    return abs(X[i] - X[j]) + abs(Y[i] - Y[j]);
}

int main() {
    int T, n, K, ansk = 0; //FIN;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &n, &K);
        for(int i = 1; i <= n; i++) {
            scanf("%I64d%I64d", &X[i], &Y[i]);
        }
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                W[i][j] = dist(i, j);
            }
        }

        LL L = 0, R = 4e9, m, ans;
        while(L <= R) {
            m = (L + R) >> 1;

            G.Init(n, n);
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    if(W[i][j] <= m) G.Link(i, j);
                }
            }

            if(G.Dance(0, K)) {
                ans = m;
                R = m - 1;
            } else L = m + 1;
        }
        printf("Case #%d: %I64d\n", ++ansk, ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qwb492859377/article/details/48930017

智能推荐

GBK GB2312 UTF-8 编码问题_waj89757的博客-程序员秘密

这是一个异常经典的问题,有无数的新手站长每天都在百度这个问题,而我,作为一个“伪老手”站长,在明白这个这个问题的基础上,有必要详细的解答一下。首先,我们要明白,GB2312、GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码。只是对于我们中国人的网站来说,用这三种编码比较多。简单的说一下,为什么要用编码,在计算机内,储存文本信息用ASC II码,每一个字符对应着唯一的ASCII

字符串日期 转换成 需要的格式的 字符串日期(超强)_日期字符串转换为指定格式的日期_gsllz的博客-程序员秘密

字符串日期 转换成 需要的格式的 字符串日期 网上有很多,不合格,要么不兼容,要么麻烦的要死,写个简单的分享给大家。兼容性很高。给我个字符串日期,然后给我你想要的格式如yyyy-MM-dd或yyyyMMddHHmm或MMdd等等,然后我返回给你这个格式的字符串日期。 我自己写的自己很满意,如果为空,你要是要当前时间的,传个true,我给你当前时间的你要的日期,如果不要,我传空串给你,也不会报错,也不会抛异常。nice,代码简洁,通用性强,易达到目的,且性能好。反正我自己用的非常爽。/.

oracle返回并集不包括重复行,Oracle数据库基础题库【含答案】_DariusJ的博客-程序员秘密

C、select所属分类,sum(价格) from 产品表 where 价格&gt;1000 group by 所属分类 D、select所属分类,sum(价格) from 产品表 where max(价格)&gt;1000 group by 所属分类11、在emp表中查找名字以G开头的SQL语句是:( A)。 A. SELECT ename, hiredate FROM emp...

BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)_weixin_34238642的博客-程序员秘密

Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3467  Solved: 1438[Submit][Status][Discuss]Description  如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus)。所谓简单回路就是指在图上不重复经过任何一个顶点的回路。...

Java常用API(七)——文件基于指针读写RandomAccessFile类_12mundane的博客-程序员秘密

    java.io.RandomAccessFile用来读写文件数据的类,其基于指针对文件数据进行读写操作(二进制字节)。    RandomAccessFile创建有两种模式:        r:只读模式,只读文件数据,并不会写入内容        rw:读写模式,对文件既可以读也可以写    常见构造方法:        RandomAccessFile(String ...

解决ajax传值问题_旧城不暖少年的博客-程序员秘密

如何解决ajax接收的值的问题最近在一直使用AJAX来实现局部刷新,但是突然发现AJAX接收后台的信息全是未定义,然后最近才发现要想在前台页面获取到改变类型的值,需要进行Json数据转换。$(".btnfb").each(function () { $(this).click(function () { var _this = $(this); $.ajax({ url: "/ZH_SY/Save", type: "

随便推点

static关键字作用分析_fanger8848的博客-程序员秘密

## static关键字作用分析 ##**static关键字主要有两种作用:**    * 第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。    * 第二,实现某个方法或属性与类而不是对象关联在一起具体而言,在Java语言中,static主要有4中使用情况:成员变量、成员方法、代码块和内部类**(1)static成员变量:**    J

Linux 系统增加Swap分区扩容运行内存_电脑系统swap能超出电脑运存吗_优小U的博客-程序员秘密

Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。Android是基于Linux的操作系统,所以也可以使用Swap分区来提升系统运行效率。通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要,通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。具体使用如下:

SPI FLASH配置7系列的FPGA相关问题(二)设置FLASH配置参数_flash 7ch_ERROR:99的博客-程序员秘密

对FLASH配置速度和位宽的设置 一定要先对工程进行综合图1。然后打开综合后的文件,即点击“Open Syn...

Keras实现英文到中文机器翻译 seq2seq+LSTM_seq2seq机器翻译 英文到中文_萌龙如我们的博客-程序员秘密

该模型实现的是英文到中文的翻译,下图为了更好展示模型架构用的大佬的图:整体由encoder和decoder两大部分组成,每部分都有一个LSTM网络,其中encoder输入原始的句子,decoder输入的是含有开始符号的翻译后的句子,输出是带有结尾标志福德目标句子。一、处理文本数据这一步骤包含对原数据进行分割获得翻译前、后的句子,生成字符的字典,最后对翻译前后的句子进行One-Hot编码,便于处理数据。1.获得翻译前后的句子先看一下原数据的样式:首先导入需要的库impor

BGP实验_qinghao11的博客-程序员秘密

实验要求1.AS1存在两个环回,一个地址为192.168.1.0/24该地址不能在任何协议中宣告 AS3存在两个环回,一个地址为192.168.2.0/24该地址不能在任何协议中宣告最终要求这两个环回可以点相通讯;AS1的另一个环回为10.1.1.0/24,AS3的另一个环回为10.1.2.0/242、整个AS2的ip地址为172.16.0.0.请合理划分3、AS间的骨干链路ip地址随意定制4、使用BGP协议让整个网络所有设备的环回可以相互访问5、减少条目数量,避免环路出现拓扑设计配IP.

【python】理解列表推导式以及列表推导式嵌套_列队猫的博客-程序员秘密

列表推导式所谓列表推导式,就是将一个可迭代的列表遍历,将每次遍历的元素拿出来进行一些操作,并用一个【】括起来,组成一个新的列表语法[expression for i in item if condition]expression 就是对每一个元素的具体操作表达式;item是某个可迭代对象的元素,如列表,元组或字符串等对象每次迭代的对象;if condition 是对每一个元素做分支判断,如果条件符合,则expression操作对应的元素.为了更好地说明列表表达式例子&gt;&gt;&

推荐文章

热门文章

相关标签