SGU 128.Snake
时间限制:0.25s
空间限制:4m
题意:
在一个平面坐标中有N个点,现在要你用这N个点构造一个闭合图形,这个图形要满足以下条件:
1.这个图形要是闭合的;
2.图形上的点只能是给定的点,且每个点只能用一次;
3.每个顶点相连的两条边必须互相垂直;
4.每条边都要平行于坐标轴;
5.每条线除了顶点外都不能互相相交;
6.闭合图形的周长要最小;
N-----点的个数
接下来N个点。
如果存在则输出最小长度;否则输出0。
Solution:
重点在所求图形所有的边都是平行于X轴或Y轴,那么要使所有点成直角,只要对所有点先对X轴再对Y轴排序
很容易发现对于在同一条竖线方向和同一条横线方向的点,一定是两个两个点相连。
现在问题是如何判断线段相交的情况
假如现在已经连接完所有竖直方向的边,接着我们连接横向的边,两点为(x1,y,x2,y),
如果存在一条竖直边(a,b1,a,b2) 使得x1<x<x2 且 b1<y<b2 那么这两条边相交
于是可以将排完序的所有的相同的x分为一组,如果x1,和x2所在的组内还有别的组的话即使得x1<x<x2 ,
就将那些组的边取出来,再判断 是否 b1<y<b2 是否满足,最后再判断得的的是否是只有一个闭合曲线,并查集即可。
参考代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 11111;
struct node {
int x, y, Pxy, Pyx;
};
int f[INF];
node Axy[INF], Ayx[INF];
int pos[INF << 2], head[INF];
int n, x, y, ans;
int Find (int x) {
if (f[x] != x) return f[x] = Find (f[x]);
return x;
}
void getT (int a, int b) {
f[Find (a)] = Find (b);
}
int cmpXY (node a, node b) {
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int cmpYX (node a, node b) {
if (a.y == b.y) return a.x < b.x;
return a.y < b.y;
}
int make() {
if (n & 1 ) return 0;
for (int i = 2; i <= n; i += 2) {
if (Axy[i - 1].x == Axy[i].x) {
getT (i, i - 1);
ans += Axy[i].y - Axy[i - 1].y;
}
else return 0;
}
for (int i = 2; i <= n; i += 2) {
if (Ayx[i - 1].y == Ayx[i].y) {
getT (Ayx[i - 1].Pxy, Ayx[i].Pxy);
ans += Ayx[i].x - Ayx[i - 1].x;
}
else return 0;
if (pos[Ayx[i - 1].x ] + 1 != pos[Ayx[i].x ])
for (int j = head[pos[Ayx[i - 1].x ] + 1];
j < head[pos[Ayx[i].x ]] - 1; j += 2)
if (Axy[j].y < Ayx[i].y && Ayx[i].y < Axy[j + 1].y) return 0;
}
for (int i = 2; i <= n; i++)
if (Find(i) != Find(i-1))
return 0;
return ans;
}
int main() {
scanf ("%d", &n);
for (int i = 1; i <= n; i++) {
scanf ("%d %d", &Axy[i].x, &Axy[i].y);
Axy[i].x += INF, Axy[i].y += INF;
}
sort (Axy + 1, Axy + n + 1, cmpYX);
for (int i = 1; i <= n; i++) {
Axy[i].Pyx = i;
Ayx[i] = Axy[i];
}
sort (Axy + 1, Axy + n + 1, cmpXY);
int now = -1, t = 0;
for (int i = 1; i <= n; i++) {
Ayx[Axy[i].Pyx].Pxy = i, f[i] = i;
if ( Axy[i].x != now ) {
now = Axy[i].x, head[++t] = i;
pos[now] = t;
}
}
printf ("%d", make() );
return 0;
}
SGU 128.Snake的更多相关文章
- SGU 128. Snake --- 暴力枚举+并查集+贪心+计算几何
<传送门> 128. Snake time limit per test: 0.25 sec. memory limit per test: 4096 KB There are N poi ...
- 0SGU 128 snake (&& ZOJ 3521) 尺取,排序二叉树,线段树 难度:2
128. Snake time limit per test: 0.25 sec. memory limit per test: 4096 KB There are N points given by ...
- Snake - SGU 128(构造多边形)
题目大意:有N个点,如果可以使用这N个点连接,连接的时候任意两条边要成直角,任意边都要平行于x轴或者y轴,并且不能出现跨立相交,最终组成一个闭合的多边形,求出来这个多边形的最小长度. 分析:容易证明这 ...
- SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...
- SGU Volume 1
SGU 解题报告(持续更新中...Ctrl+A可看题目类型): SGU101.Domino(多米诺骨牌)------------★★★type:图 SGU102.Coprimes(互质的数) SGU1 ...
- OpenCV学习代码记录—— Snake轮廓
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- SGU 205. Quantization Problem
205. Quantization Problem time limit per test: 0.25 sec. memory limit per test: 65536 KB input: stan ...
- Deep Snake : 基于轮廓调整的SOTA实例分割方法,速度32.3fps | CVPR 2020
论文提出基于轮廓的实例分割方法Deep snake,轮廓调整是个很不错的方向,引入循环卷积,不仅提升了性能还减少了计算量,保持了实时性,但是Deep snake的大体结构不够优雅,应该还有一些工作可以 ...
- 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)
建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...
随机推荐
- css3图片墙
css相关知识: 1. 使用box-shadow设置图片阴影,为照片加上阴影 eg: box-shadow: 0 0 5px 3px #abc 2. 使用tansform-origin定义变形原点 e ...
- word中MathType公式不能 二次编辑解决方案
问题:当新建文档然后插入公式,此时可以利用mathtype进行编辑,保存后推出第二次打开,双击公式却发现不能编辑公式. 解决方案: ////////////////////////////////// ...
- .net开源工作流引擎ccflow
关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款1 ...
- asp 数组
定义简单数组 有两种方法在asp中定义和初始化数组,让我们看看每种的例子: 方法一:MyArray = Array("Jan","Feb","Mar& ...
- Sysrq 诊断系统故障 与 gdb 调试core dump
1. 典型应用场景如: 1)系统进入了挂死状态(如调度出现异常.或系统负荷过重),但仍能响应中断,此时可以通过Sysrq魔术键(c)手工触发panic,结合kdump,就能收集到vmcore信息 ...
- Intellij IDEA 导入Eclipse或MyEclipse的Web项目(旧版 转载)
Intellij IDEA 导入Eclipse或MyEclipse的Web项目 博客分类: Intellig IDEA Intellij IDEAEclipseWeb Intellij IDEA 导 ...
- x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1
文章文件夹: x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1 x264 编码器选项分析 (x264 Codec Strong and Weak P ...
- 《31天成为IT服务达人》之精准运维
1 第十四章精准运维服务 近年来国内IT产业的发展格局始终与我国的经济转型与创新创业的社会大潮息息相关,纵观国内国际形势,IT产业仍是创新的领头者,是解决人类各种经济危机的主要扮演者 ...
- nrf51822蓝牙芯片ble_app_proximity程序总结
近期由于钥匙的事情,研究了下官方自带的ble_app_proximity程序,事实上就是跟防丢有关系的程序. 同一时候也发现了看nordic程序的一些门道,主要还是看协议栈里面的一些service,首 ...
- A different twist on pre-compiling JSPs--reference
I’ve blogged about this topic earlier and expressed my frustrations as to how web containers don’t p ...