技术标签: 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;
}
这是一个异常经典的问题,有无数的新手站长每天都在百度这个问题,而我,作为一个“伪老手”站长,在明白这个这个问题的基础上,有必要详细的解答一下。首先,我们要明白,GB2312、GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码。只是对于我们中国人的网站来说,用这三种编码比较多。简单的说一下,为什么要用编码,在计算机内,储存文本信息用ASC II码,每一个字符对应着唯一的ASCII
字符串日期 转换成 需要的格式的 字符串日期 网上有很多,不合格,要么不兼容,要么麻烦的要死,写个简单的分享给大家。兼容性很高。给我个字符串日期,然后给我你想要的格式如yyyy-MM-dd或yyyyMMddHHmm或MMdd等等,然后我返回给你这个格式的字符串日期。 我自己写的自己很满意,如果为空,你要是要当前时间的,传个true,我给你当前时间的你要的日期,如果不要,我传空串给你,也不会报错,也不会抛异常。nice,代码简洁,通用性强,易达到目的,且性能好。反正我自己用的非常爽。/.
C、select所属分类,sum(价格) from 产品表 where 价格>1000 group by 所属分类 D、select所属分类,sum(价格) from 产品表 where max(价格)>1000 group by 所属分类11、在emp表中查找名字以G开头的SQL语句是:( A)。 A. SELECT ename, hiredate FROM emp...
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3467 Solved: 1438[Submit][Status][Discuss]Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus)。所谓简单回路就是指在图上不重复经过任何一个顶点的回路。...
java.io.RandomAccessFile用来读写文件数据的类,其基于指针对文件数据进行读写操作(二进制字节)。 RandomAccessFile创建有两种模式: r:只读模式,只读文件数据,并不会写入内容 rw:读写模式,对文件既可以读也可以写 常见构造方法: RandomAccessFile(String ...
如何解决ajax接收的值的问题最近在一直使用AJAX来实现局部刷新,但是突然发现AJAX接收后台的信息全是未定义,然后最近才发现要想在前台页面获取到改变类型的值,需要进行Json数据转换。$(".btnfb").each(function () { $(this).click(function () { var _this = $(this); $.ajax({ url: "/ZH_SY/Save", type: "
## static关键字作用分析 ##**static关键字主要有两种作用:** * 第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。 * 第二,实现某个方法或属性与类而不是对象关联在一起具体而言,在Java语言中,static主要有4中使用情况:成员变量、成员方法、代码块和内部类**(1)static成员变量:** J
Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。Android是基于Linux的操作系统,所以也可以使用Swap分区来提升系统运行效率。通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要,通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。具体使用如下:
对FLASH配置速度和位宽的设置 一定要先对工程进行综合图1。然后打开综合后的文件,即点击“Open Syn...
该模型实现的是英文到中文的翻译,下图为了更好展示模型架构用的大佬的图:整体由encoder和decoder两大部分组成,每部分都有一个LSTM网络,其中encoder输入原始的句子,decoder输入的是含有开始符号的翻译后的句子,输出是带有结尾标志福德目标句子。一、处理文本数据这一步骤包含对原数据进行分割获得翻译前、后的句子,生成字符的字典,最后对翻译前后的句子进行One-Hot编码,便于处理数据。1.获得翻译前后的句子先看一下原数据的样式:首先导入需要的库impor
实验要求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.
列表推导式所谓列表推导式,就是将一个可迭代的列表遍历,将每次遍历的元素拿出来进行一些操作,并用一个【】括起来,组成一个新的列表语法[expression for i in item if condition]expression 就是对每一个元素的具体操作表达式;item是某个可迭代对象的元素,如列表,元组或字符串等对象每次迭代的对象;if condition 是对每一个元素做分支判断,如果条件符合,则expression操作对应的元素.为了更好地说明列表表达式例子>>&