sgu 128

news/2024/10/17 13:24:34/

题意:
在平面上有N个点,现在要求一些线段,使其满足以下要求:
a. 这些线段必须闭合
b. 线段的端点只能是这N个点
c. 交于一点的两条线段成90度角
d. 线段都必须平行于坐标轴
e. 所有线段除在这N个点外不自交
f. 所有线段的长度之和必须最短
如果存在这样的线段,则输出最小长度,否则输出0。
解:a.并查集判断是否是一个闭合图形而不是两个闭合图形 
b.c. d.  可知每一行每一列的坐标上点的数量必须为偶数,若为奇数则肯定会有一个多余的点无法连入图中
f.可推断出若要满足以上条件一定只有一个图存在,所以不用判断是否为最小周长
e.用线段树判断:单点修改,区间查询;

代码如下:

#include<iostream>

#include<algorithm>
#include<vector>
#include<stdio.h>
#define lson (id*2)
#define rson (id*2+1)
using namespace std;
struct edge{
int x;int y;int val;int id;
}tree[80010],p[50005];
vector<int>linx[50010];
vector<int>liny[50010];
int fa[10010];
int find(int a)
{
if (fa[a]==a)
return a;
return fa[a]=find(fa[a]);
}
int unio(int a,int b)
{
fa[find(a)]=find(b);
return 0;
}
int cmp1(edge a,edge b)
{
if (a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
int cmp2(edge a,edge b)
{
if (a.y!=b.y)
return a.y<b.y;
else
return a.x<b.x;
}

int ans=0;

//开始建树

void push_up(int id)
{
tree[id].val=tree[lson].val+tree[rson].val;
return ;
}
void build_tree(int id,int l,int r)
{
if (l>=r)
{
tree[id].val=0;
return ;
}
int mid=(l+r)/2;
build_tree(lson,l,mid);
build_tree(rson,mid+1,r);
push_up(id);
return ;
}
void add_tree(int id,int l,int r,int x)
{
if (l==r&&r==x)
{
tree[id].val+=1;
tree[id].val%=2;
return ;
}
int mid=(l+r)/2;
if (mid>=x)
add_tree(lson,l,mid,x);
else
add_tree(rson,mid+1,r,x);
push_up(id);
return ;
}
void query_tree(int id,int l,int r,int L,int R)
{
if (L>R) return;
if (L<=l&&R>=r)
{
ans+=tree[id].val;
return ;
}
int mid=(l+r)/2;
if (mid>=L)
query_tree(lson,l,mid,L,R);
if (mid+1<=R)
query_tree(rson,mid+1,r,L,R);
return ;
}//建树完毕
int n,mx=-10004,my=-10004;
long long C=0;
void solve_before()
{
sort(p+1,p+1+n,cmp1);
for (int i=1;i<=n;i++)
linx[p[i].x].push_back(p[i].y);

sort(p+1,p+1+n,cmp2);
for (int i=1;i<=n;i++)
liny[p[i].y].push_back(p[i].x);

sort(p+1,p+1+n,cmp1);
}
int main()
{
build_tree(1,1,20001);
scanf("%d",&n);
for (int i=1;i<=n;i++)
fa[i]=i;
for (int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
p[i].x+=10001;
p[i].y+=10001;
p[i].id=i;
mx=max(mx,p[i].x);
my=max(my,p[i].y);
}
solve_before();
for (int i=0;i<=max(mx,my);i++)
{
if (linx[i].size()%2!=0||liny[i].size()%2!=0)
{
cout<<"0"<<endl;
return 0;
}
}
for (int i=1;i<=n;i+=2)
{
ans=0;
C+=p[i+1].y-p[i].y;
unio(p[i].id,p[i+1].id);
add_tree(1,1,20001,p[i].y);
add_tree(1,1,20001,p[i+1].y);
query_tree(1,1,20001,p[i].y+1,p[i+1].y-1);
if (ans>0)
{
cout<<"0"<<endl;
return 0;
}

}
sort(p+1,p+1+n,cmp2);

for (int i=1;i<=n;i+=2)
{
unio(p[i+1].id,p[i].id);
C+=p[i+1].x-p[i].x;
}
for (int i=1;i<n;i++)
{
if (find(i)!=find(i+1))
{
cout<<"0"<<endl;
return 0;
}
}
cout<<C<<endl;
return 0;

}

更具体题解参考     : http://blog.sina.com.cn/s/blog_51cea4040100gf9l.html


http://www.ppmy.cn/news/327782.html

相关文章

SGU 221

题目大意&#xff1a;给你一块n*n的国际象棋盘&#xff0c;放k个象&#xff0c;有多少种互不攻击的方法。 我们可以把棋盘转45度&#xff0c;那么象就可以看成车了&#xff0c;而且黑格象白格象不可能互相攻击&#xff0c;于是我们考虑白格象。 我们先把每一斜行的格子数拿出…

CSU 2167

题意&#xff1a;初始有n*m的点&#xff0c;矩形排列。有2种操作&#xff0c;第一种是将第i行的所有点联通&#xff08;a<i<b&#xff09;,第二种是将第i列的所有点联通&#xff08;a<i<b&#xff09;。每次操作后输出有多少个联通块。 分析&#xff1a;在纸上画一…

微星z370黑苹果_记录一下装了第二台黑苹果(Z370 + High Sierra)

这几天意识到自己还是得有台比较快的 Mac&#xff0c;14 Mid 的 13 寸接屏幕用起来麻烦&#xff0c;而且速度堪忧&#xff0c;所以看了看主板背面的 M.2 插槽&#xff0c;就决定来装个黑苹果。 配置单如下&#xff1a; PCPartPicker part list: https://pcpartpicker.com/list/…

P1716 双调序列

题目描述 电脑组的童鞋们经常玩一些智力PK小游戏&#xff0c;某月某日&#xff0c;发源于小朋友又发明了一种新的序列&#xff1a;双调序列&#xff0c;所谓的双调呢主要是满足如下条件描述&#xff1a; 假定有n(n<1000)个整数&#xff08;都在longint范围内&#xff0c;即…

2166 Eocnding

给定一个只包含“A”—“Z”的字符串&#xff0c;我们可以使用以下方法对其进行编码:1 .每个包含k个相同字符的子字符串都应该编码为“kX”&#xff0c;其中“X”是该子字符串中的唯一字符。2.如果子字符串的长度为1&#xff0c;则应忽略“1”。输入第一行包含一个整数N (1 <…

74LVC1G3157GW

制造商编号&#xff1a;74LVC1G3157GW 制造商&#xff1a;nxp半导体 说明&#xff1a;多路复用开关 IC 产品: 复用器/解复用器 安装风格: 贴片/贴片 封装 / 箱体: TSSOP-6 通道数量: 2通道 配置: 1 x 2:1 电源电压-最小: 1.65V 电源电压-: 5.5V 最小双重电源电压: - …

【WCH】CH32F203基于硬件I2C + SSD1306 OLED跑图形库

【WCH】CH32F203基于硬件I2C SSD1306 OLED跑图形库 &#x1f388;基于STM32图形库开源项目地址&#xff1a;https://github.com/hello-myj/stm32_oled&#x1f4cc;相关篇《【WCH】CH32F203硬件I2C驱动SSD1306 OLED》&#x1f4cd;《【WCH】CH32F203软件I2C驱动SSD1306 OLED》…

SuperIo-Nct6106d

SuperIo的调试 SuperIo简称SIO,是一款Lpc设备芯片,支持多接口扩展. 文章目录 SuperIo的调试SIO 包含哪些功能?如何通过Lpc来初始化SIO?Global Controller RegisterUART Func SIO 包含哪些功能? 虽不同款芯片支持的功能可能不尽相同,但是大体流程和基本功能还是很相近的,下面…