博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Arc076_E Connected?
阅读量:5216 次
发布时间:2019-06-14

本文共 1266 字,大约阅读时间需要 4 分钟。

题目大意

给定$H\times W$的网格$(W,H\leq 10^8)$上的$N$对顶点,即两线交叉的交叉点而非格子内部$(N\leq 10^5)$,求是否存在至少一种方案使得每对点之间都有一条不出网格边界的曲线且曲线互不相交。

 

题解

假设当前连线情况确定,两点之间是否存在意在连线的可能仅与两点间的连通性由有关,很显然当一对点有任意一点不在边界上,那么由于所有点两两不同,那么连接这对点对其他点对的连通性毫无影响,所以我们只需要判断所有点都在边界上的那些点对之间有没有两两交叉的即可。

可以将方格边界上顺时针标号,将每个对点看做一个区间,判断区间之间是否只存在包含关系即可,这个用类似括号序列一样的方法用栈维护递增的左端点,最后只需要判断栈中有没有未删掉的元素。

 

#include
#include
#include
#include
#include
#define LL long long#define M 400020using namespace std;int read(){ int nm=0,fh=1; int cw=getchar(); for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh; for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0'); return nm*fh;}struct num{ int pos,id;num(){pos=0,id=0;} num(int _pos,int _id){pos=_pos,id=_id;}}p[M],S[M];int vis[M],H,W,n,top;bool on(int x,int y){return x==0||y==0||x==H||y==W;}int bas(int x,int y){ if(!x) return y; if(y==W) return W+x; if(x==H) return W+H+W-y; return W+H+W+H-x;}bool cmp(num x,num y){return x.pos
R) swap(L,R); p[(i<<1)-1]=num(L,i),p[i<<1]=num(R,i); } n<<=1,sort(p+1,p+n+1,cmp); for(int i=1;i<=n;i++){if(S[top].id!=p[i].id||!top) top++,S[top]=p[i];else top--;} puts(top?"NO":"YES"); return 0;}

 

转载于:https://www.cnblogs.com/OYJason/p/9799133.html

你可能感兴趣的文章
Linux升级内核教程(CentOS7)
查看>>
Lintcode: Partition Array
查看>>
分享适合个人站长的5类型网站
查看>>
类别的三个作用
查看>>
【SICP练习】85 练习2.57
查看>>
runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
查看>>
Maximum Product Subarray
查看>>
solr相关配置翻译
查看>>
通过beego快速创建一个Restful风格API项目及API文档自动化(转)
查看>>
解决DataSnap支持的Tcp长连接数受限的两种方法
查看>>
Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调
查看>>
ASP.NET MVC5 高级编程-学习日记-第二章 控制器
查看>>
Hibernate中inverse="true"的理解
查看>>
高级滤波
查看>>
使用arcpy添加grb2数据到镶嵌数据集中
查看>>
[转载] MySQL的四种事务隔离级别
查看>>
QT文件读写
查看>>
C语言小项目-火车票订票系统
查看>>
15.210控制台故障分析(解决问题的思路)
查看>>
BS调用本地应用程序的步骤
查看>>