bzoj4080
分组赛时wy大神讲的题,网上都是随机化的题解
我来讲一下正解吧,我们穷举两个点,这两点距离要小于限制
然后我们分别以这两个点为圆心,两点距离为半径画圆
圆圆相交的部分被两点练成线段划分成两部分,不难发现
每个部分内点点之间的距离是小于限制的,很明显想到二分图
对于上半部分与下半部分的两点,如果距离大于限制则连边
然后我们求最大点独立集即可
求最大独立集的方案各种想错,实在太SB
做完最大匹配后首先先把未匹配的点拉出来,然后把他们有边相连的点都标记
然后处理每对匹配,若一个点被标记则选另一个点
这样是不可能出现两个点都标记的匹配,因为这样就会出现一条增广路,与最大匹配矛盾
type node=record
po,next:longint;
end; var e,ee:array[..] of node;
q,q1,q2,c,x,y,cy,cx,p:array[..] of longint;
v,v1,v2:array[..] of boolean;
z,ll,d,t1,t2,i,j,k,l,ans,len,n:longint; procedure add(x,y:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
p[x]:=len;
ee[len].po:=x;
ee[len].next:=q[y];
q[y]:=len;
end; function dfs(x:longint):longint;
var i,y:longint;
begin
i:=p[x];
while i<> do
begin
y:=e[i].po;
if not v[y] then
begin
v[y]:=true;
if (cy[y]=-) or (dfs(cy[y])=) then
begin
cy[y]:=x;
cx[x]:=y;
exit();
end;
end;
i:=e[i].next;
end;
exit();
end; function match:longint;
var i:longint;
begin
fillchar(cy,sizeof(cy),);
fillchar(cx,sizeof(cx),);
match:=t1+t2;
if (t2=) or (t1=) then exit;
for i:= to t1 do
if cx[i]=- then
begin
fillchar(v,sizeof(v),false);
match:=match-dfs(i);
end;
end; function cross(i,j,k:longint):longint;
begin
exit((x[i]-x[k])*(y[j]-y[k])-(x[j]-x[k])*(y[i]-y[k]));
end; function dis(i,j:longint):longint;
begin
exit(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
end; begin
readln(n,d);
d:=d*d;
for i:= to n do
readln(x[i],y[i]);
ans:=;
c[]:=;
for i:= to n- do
for j:=i+ to n do
if dis(i,j)<=d then
begin
ll:=dis(i,j);
t1:=;
t2:=;
fillchar(p,sizeof(p),);
fillchar(q,sizeof(q),);
len:=;
for k:= to n do
if (dis(i,k)<=ll) and (dis(j,k)<=ll) then
begin
if cross(k,j,i)>= then
begin
inc(t1);
q1[t1]:=k;
end
else begin
inc(t2);
q2[t2]:=k;
end;
end;
for k:= to t1 do
for l:= to t2 do
if dis(q1[k],q2[l])>d then add(k,l); l:=match;
if l>ans then
begin
ans:=;
fillchar(v1,sizeof(v1),false);
fillchar(v2,sizeof(v2),false);
for k:= to t1 do
if cx[k]=- then
begin
inc(ans);
c[ans]:=q1[k];
z:=p[k];
while z<> do
begin
v2[e[z].po]:=true;
z:=e[z].next;
end;
end; for k:= to t2 do
if cy[k]=- then
begin
inc(ans);
c[ans]:=q2[k];
z:=q[k];
while z<> do
begin
v1[ee[z].po]:=true;
z:=ee[z].next;
end;
end; for k:= to t1 do
if cx[k]<>- then
begin
inc(ans);
if not v1[k] then c[ans]:=q1[k]
else c[ans]:=q2[cx[k]];
end;
end;
end;
writeln(ans);
for i:= to ans do
write(c[i],' ');
writeln;
end.
bzoj4080的更多相关文章
- 【随机化】bzoj4080 [Wf2014]Sensor Network
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef ...
- 【BZOJ4080】【WF2014】Sensor Network [随机化]
Sensor Network Time Limit: 2 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 魔法炮来到了帝都 ...
- 【bzoj4080】[Wf2014]Sensor Network 随机化
题目描述 魔法炮来到了帝都,除了吃特色菜之外,还准备去尝一尝著名的北京烤鸭.帝都一共有n(1<=1<=100)个烤鸭店,可以看成是二维平面内的点.不过由于魔法炮在吃烤鸭之前没有带钱,所以吃 ...
随机推荐
- c语言基础:各种数据类型的输出占位符
c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d ; printf("这个整数是:%d&q ...
- vs2008调试提示:未安装Silverlight托管调试包
换个启动浏览器,解决了. 右击项目,选择“属性”,选择"web";启动操作设置“启动外部程序”,填入浏览器exe的路径. 命令行参数填入地址.即可.
- Codeforces Round #343 (Div. 2) C. Famil Door and Brackets
题目链接: http://codeforces.com/contest/629/problem/C 题意: 长度为n的括号,已经知道的部分的长度为m,现在其前面和后面补充‘(',或')',使得其长度为 ...
- 网站常用css必备css reset
在我们写前端代码页面的时候,很多常用的CSS类都是固定的!但没有一个标准或者大家都按自己的方式去随意的写,这样就每次都重复写一些固定的类! 为此HTML5 Doctor(HTML5医生)为我们总结了一 ...
- win下Maven安装和基本设置
注:本文介绍 Windows 平台上 Maven 的安装.Maven 3 需要运行在 JDK1.4 以上的版本上. 非原创:原创地址 http://www.ibm.com/developerworks ...
- 【BZOJ】【1070】【SCOI2007】修车
网络流/费用流 好神奇的建模= = 关键就是把每个技术员拆成n个点,表示这个技术员倒数第几个修的车子.. 考虑第i个工人,他修第j辆车只对后面要修的车有影响,而前面修过的车已经对当前没有影响了.而这个 ...
- NYOJ-469 擅长排列的小明 II AC 分类: NYOJ 2014-01-02 22:19 159人阅读 评论(0) 收藏
最初的第一印象是和组合数一个性质的题目.所以用了回溯法,结果,你懂的... #include<stdio.h> #include<math.h> void dfs(int n, ...
- PHP输出中文乱码的问题
用echo输出的中文显示成乱码, 其实应该是各种服务器脚本都会遇到这个问题, 根本还是编码问题, 一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8 <meta http-equi ...
- 提高jQuery执行效率需要注意几点
1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...
- Oracle调优总结(经典实践 重要)
转载:http://langgufu.iteye.com/blog/1974211 Problem Description:1.每个表的结构及主键索引情况2.每个表的count(*)记录是多少3.对于 ...