按我的理解大概说下题意:

有非常多个点,最多一万个,告诉你它们的坐标。如今须要构造一条闭合线。这个闭合线满足下面六点:

1必须是闭合的。

2必须用到全部的点。

3构造的线段之间若成角,则必须是90度。

4构造的边必须与x或y轴平行。

5构造的线段之间不存在交错和反复的情况。

6最后形成的闭合线长度必需要是全部可能中最短的。

由于我认为能不用复杂的数据结构就不用,能不写麻烦的算法就不写,所以估算了一下时间复杂度,发现能够

用暴力,于是,我的做法就是暴力。

以下是较具体的做法:

既然要构造一条线出来,直接构造的话,我不知道怎么搞,于是用分治的思想,每次弄两个点出来,看应不应该

把它们连起来,因为要求成角必须是90,又要线的长度最短,于是当两个点的横坐标或纵坐标相等,它们之间的

距离与它们之中随意一点跟它们之外的其他点的距离相比是最短的话,那么就能够相连。

实现这个过程,我是用两次排序排序,第一次排序,假设横坐标不等则按横坐标递增排序,否则按纵坐标递增排序,

第1个点跟第2个点相连,第3个点跟第4个点相连,以此类推。第二次排序,假设纵坐标不等则按纵坐标递增排序,

否则按横坐标递增排序,相同的,第1个点跟第2个点相连,第3个点跟第4个点相连,以此类推。

这样就把全部的点给连好了。

当然这种话,结果不一定是一个闭合的线,可能有多个闭合线,当然也有可能没有闭合的线,或是有两条线段交错的情况。

所以还须要推断是否闭合以及唯一,也就是说,推断构造出的线段能否形成一个连通图,这个用并查集就好。

也要推断是否有两条线段交错,这个的话,我直接枚举全部情况,我把横线跟竖线分开,然后枚举是否有横线跟竖线交错,

假设构造的图连通,那么最多有一万条边,横线跟竖线的数量也是一样多的,也就是最多各位五千,那么枚举的数量是

五千的平方,也就是25乘以10的6次方,题目给了250ms,所以时间上绰绰有余,不会超时。

于是推断之后,假设发现图是一个连通图,又没有线段交错的情况,那么就能够把构造好的闭合线长度输出来了。

我AC的代码例如以下:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
#define end {printf("0");return 0;}
int num_dot,num_x,num_y,father[10001];
struct node
{
int x,y,no;
}dot[10001];
struct node1
{
node s,e;
}sidex[10001],sidey[10001];
int sf(int i)
{
while(i!=father[i])
i=father[i];
return i;
}
bool isconnex()
{
int i,a,b,sum=0;
for(i=0;i<num_dot;i++)
father[i]=i;
for(i=0;i<num_x;i++)
father[sf(sidex[i].s.no)]=sf(sidex[i].e.no);
for(i=0;i<num_y;i++)
father[sf(sidey[i].s.no)]=sf(sidey[i].e.no);
for(i=0;i<num_dot;i++)
if(father[i]==i)
{
sum++;
if(sum>1)
return 0;
}
return 1;
}
bool cmp1(node a,node b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
bool cmp2(node a,node b)
{
if(a.y!=b.y)
return a.y<b.y;
return a.x<b.x;
}
int newside()
{
int i,sum=0;
num_x=num_y=0;
sort(dot,dot+num_dot,cmp1);
for(i=0;i<num_dot;i+=2)
if(dot[i].x!=dot[i+1].x)
return -1;
else
{
sum+=dot[i+1].y-dot[i].y;
sidex[num_x].s=dot[i];
sidex[num_x].e=dot[i+1];
num_x++;
}
sort(dot,dot+num_dot,cmp2);
for(i=0;i<num_dot;i+=2)
if(dot[i].y!=dot[i+1].y)
return -1;
else
{
sum+=dot[i+1].x-dot[i].x;
sidey[num_y].s=dot[i];
sidey[num_y].e=dot[i+1];
num_y++;
}
return sum;
}
bool iscross()
{
int i,j;
for(i=0;i<num_x;i++)
for(j=0;j<num_y;j++)
if(sidex[i].s.x>sidey[j].s.x&&sidex[i].s.x<sidey[j].e.x&&sidey[j].s.y>sidex[i].s.y&&sidey[j].s.y<sidex[i].e.y)
return 1;
return 0;
}
int main()
{
int i,sum;
scanf("%d",&num_dot);
for(i=0;i<num_dot;i++)
{
scanf("%d%d",&dot[i].x,&dot[i].y);
dot[i].no=i;
}
if(num_dot&1)
end
sum=newside();
if(sum==-1)
end
if(isconnex()&&!iscross())
printf("%lld",sum);
else
end
}

sgu128snack的更多相关文章

随机推荐

  1. Extjs4.0.7 实现Grid的嵌套

    网上相关资料非常少,我看过的大多是Extjs 3.0 急以前版本的解决方案. 比如:http://mikhailstadnik.com/ext/examples/nested-grid.htm  (E ...

  2. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

  3. mysql xtrabackup增量备份

    mysql 增量备份策略 周一全备,其他增量备份,根据业务需要,设定保留日期,如保留一月. 增量备份步骤; 1 创建全备 2 根据全备目录,创建增量备份 3 第二次增量备份根据第一次增量备份目录,依次 ...

  4. Objective-C类的使用

    Objective-C教程的例题: // // main.m // test // // Created by liwei on 14-10-28. // Copyright (c) 2014年 li ...

  5. UVA - 12232 Exclusive-OR (并查集扩展偏离向量)

    Description You are not given n non-negative integersX0,X1,..., Xn-1 less than220, but they do exist ...

  6. [PATCH] UBUNTU: SAUCE: (no-up) apparmor: Sync to apparmor3 - RC1(v3.4.x kernel)

    ubuntu touch v3.4 kernel AppArmor v3 backport patch 地址1:https://github.com/multirom-aries/ubuntu-pho ...

  7. 【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings

    不easy啊.最终能够补第二个题了.! 顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错) 题目大意: 有一个n*m的矩阵.每个格子里都将有一个数.给你每一行数字之和和每 ...

  8. 9种CSS3 blend模式制作的鼠标滑过图片标题特效

    这是一款使用CSS3 background-blend-mode制作的鼠标滑过图片标题特效.该图片标题特效在鼠标滑过一张图片的时候,图片的标题会对应的动画,而且图片会使用css blend模式渲染为很 ...

  9. 输出无名空数组---精android、IOS App应用服务程序开发

    直接输出 [] 示例文件_samples/app/array_null.json在轻开平台的_samples/app/文件夹下 太Easy.无法写出很多其它的内容,大家还是自己试试吧! ! ! 相关资 ...

  10. newinstance()和new有什么区别?(转)

    在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别? 用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有 ...