题意:

给出一个$R\times C$的棋盘,其中$1$到$N$之间的每个正整数都会在棋盘上出现两次,第$i$个数出现的位置是$(X_{i,1},Y_{i,1})$和$(X_{i,2},Y_{i,2})$,现在目的是把每一对相同的数用线(粗细忽略不计)连起来,且线不能相交也不能越过棋盘边界,求是否能完成。

$1\leq R,C\leq 10^8$

$1\leq N\leq 10^5$

题解:

看上去是神仙题,实际上很假。。。

大家有没有玩过麻将连连看那种小游戏?题意中的连线意义就差不多。首先如果把这个棋盘扩展到无限大,即没有棋盘边界的限制,显然一定能满足条件。因为棋盘边上的数字连的线肯定可以在向外连足够远之后连回来,而内部的线由于可以跨越每个格子的边界,必定可以满足条件。(正确性感性理解一下?)

那么有了边界限制之后,就只用考虑在两个位置都在边界上的那些数字,把这些数字看成一对括号,如果整个边界上按顺序(顺时针或逆时针)能构成一个合法括号序列,那么就能满足,否则就不行。画个图感受一下:

如图,左图是非法的而右图是合法的。那这个东西直接用栈判断一下就好了。。。先把所有位置排序,然后如果现在位置的数字和栈顶相等则弹出栈顶,否则把当前数字压入栈,最后判断栈是否为空即可。

ps:这题细节极其恶心!写挂了五六次才过样例。。。(可能是我写法比较挫)

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
struct node{
int x,id;
}li[][];
int r,c,n,x,y,xx,yy,nw,tot[];
stack<int>st;
bool cmp1(node a,node b){
return a.x<b.x;
}
bool cmp2(node a,node b){
return a.x>b.x;
}
int main(){
scanf("%d%d%d",&r,&c,&n);
for(int i=;i<=n;i++){
scanf("%d%d%d%d",&x,&y,&xx,&yy);
if((x&&y&&x!=r&&y!=c)||(xx&&yy&&xx!=r&&yy!=c))continue;
if(!x)nw=;
else if(x==r)nw=;
else if(!y)nw=;
else if(y==c)nw=;
if(nw==||nw==)li[nw][++tot[nw]]=(node){y,i};
else li[nw][++tot[nw]]=(node){x,i};
if(!xx)nw=;
else if(xx==r)nw=;
else if(!yy)nw=;
else if(yy==c)nw=;
if(nw==||nw==)li[nw][++tot[nw]]=(node){yy,i};
else li[nw][++tot[nw]]=(node){xx,i};
}
for(int i=;i<;i++){
if(i==||i==)sort(li[i]+,li[i]+tot[i]+,cmp1);
else sort(li[i]+,li[i]+tot[i]+,cmp2);
for(int j=;j<=tot[i];j++){
if(!st.empty()&&li[i][j].id==st.top())st.pop();
else st.push(li[i][j].id);
}
}
if(st.empty())puts("YES");
else puts("NO");
return ;
}

最新文章

  1. Python笔记(3)迭代器与生成器
  2. 关于js中的时间处理
  3. 各大浏览器 CSS3 和 HTML5 兼容速查表
  4. shell 小问题汇总
  5. 14个Xcode中常用的快捷键操作
  6. Game start
  7. php cli模式没有加载php.ini
  8. mybaits错误解决:There is no getter for property named &#39;parentId &#39; in class &#39;java.lang.String&#39;
  9. SaaS技术栈的走势
  10. Problem E: 编写函数:Swap (I) (Append Code)
  11. Docker第一个应用:Hello World
  12. Spring点滴八:Spring注入集合
  13. javascript技巧总结
  14. Gym - 100283F Bakkar In The Army(二分)
  15. 添加APP右上角数字提醒标识
  16. Supervisor安装与配置
  17. 【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】
  18. Msql浅析-基础命令(二)
  19. Block Formatting Contexts (块级格式化上下文) 使用参考
  20. XNA项目基础

热门文章

  1. mongodb主从搭建
  2. Error running Tomcat 6: Address localhost:8080 is already in use
  3. python生成器,递归调用
  4. Lapack下载安装
  5. django-10-中间件和上下文管理器
  6. dfs序题集
  7. RabbitMQ消息可靠性分析 - 简书
  8. Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
  9. C#-基础部分思维导图
  10. 洛谷 P3420 [POI2005]SKA-Piggy Banks