题意:有一个n×n的棋盘,有m个位置是有障碍的,有一个人从(1,1)开始走,每次只能向下或向右走,他要走到(n,n),问到达(n,n)的最短距离,不能到达输出-1。

思路:稍加分析就可以得出,从(1,1)到(n,n)走的步数是确定的:2n-2。所以,唯一的问题就剩下了这个人能否走到终点。由于n非常大,所以从n着手显然不是很明智,我们可以看到m只有10^5,因此,从m入手或许是个很好的方案,我们先将m个点排序,以x为第一关键字y为第二关键字,排完序以后一行一行处理。首先,假设我们知道在上一行这个人可走的方案,我们用多个线段来描述可走的位置,那么此时到达这一行的时候,如果有障碍物,线段就有可能被截断成几部分,另外,线段也有可能延长,不断地维护这些线段,一直到没有线段,这时不能到达终点,或者,把所有障碍物处理完,还剩下线段,那么就能到终点。。。说起来这个思路倒是不难,但是写起来感觉很麻烦,之前我脑袋抽了想的是按x+y排序,然后斜着处理,原理是一样的,但是写起来就感觉太复杂了,这个一行一行扫的话就简单多了,但是依然不是很好弄,细节也不少,唉,搞了半天终于写完了,还是代码能力不够啊。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=100000+10;
struct Node
{int x,y;bool operator <(const Node &a )const{return (x==a.x&&y<a.y)||(x<a.x);}
}node[maxn];
int n,m;
struct Invert
{int l,r;Invert(){};Invert(int la,int ra){l=la;r=ra;}
}now[maxn],next[maxn];
void Uion(int & cnt1,int &cnt2)
{cnt1=0;now[cnt1++]=next[0];for(int j=1;j<cnt2;++j){if(next[j].l<=now[cnt1-1].r)now[cnt1-1]=Invert(now[cnt1-1].l,max(next[j].r,now[cnt1-1].r));elsenow[cnt1++]=next[j];}
}
bool check()
{sort(node,node+m);int i=0,cnt1=0,cnt2=0;if(node[0].x==1){now[cnt1++]=Invert(1,node[0].y-1);while(node[i].x==1&&i<m) i++;if(i>=m) return true;if(node[i].x>node[i-1].x+1) now[cnt1-1]=Invert(1,n);}else now[cnt1++]=Invert(1,n);while(i<m){cnt2=0;int k=0,v=node[i].x;if(v==n){if(now[cnt1-1].r>node[m-1].y) return true;return false;}while(node[i].x==v&&i<m&&k<cnt1){while(node[i].y<now[k].l&&i+1<m&&node[i+1].x==v) i++;if(i>=m) break;if(node[i].y<now[k].l) {next[cnt2++]=Invert(now[k].l,n);break;}if(node[i].y>now[k].r){next[cnt2++]=Invert(now[k].l,node[i].y-1);while(k+1<cnt1&&now[k+1].r<=node[i].y-1) k++;k++;}else{if(node[i].y==now[k].l){now[k].l++;if(now[k].r<now[k].l) k++;i++;}else{next[cnt2++]=Invert(now[k].l,node[i].y-1);now[k].l=node[i].y+1;if(now[k].r<now[k].l) k++;i++;}}}if(k<cnt1){next[cnt2++]=Invert(now[k].l,n);}if(cnt2==0) return false;while(i<m&&node[i].x==v) i++;if(i<m){if(node[i].x>v+1){cnt1=0;now[cnt1++]=Invert(next[0].l,n);}else Uion(cnt1,cnt2);}}return true;
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);while(~scanf("%d%d",&n,&m)){for(int i=0;i<m;++i)scanf("%d%d",&node[i].x,&node[i].y);if(check())printf("%d\n",n*2-2);elseprintf("-1\n");}return 0;
}

CF 383B Volcanoes相关推荐

  1. 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

    前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)--基础之后 『参考』.net CF组件编程 ...

  2. OC对象 vs CF对象

    2019独角兽企业重金招聘Python工程师标准>>> OC对象 vs CF对象 在ARC场景下,对象所有权没有转换 使用__bridge关键字即可实现CF对象和OC对象之间的自由转 ...

  3. CF 990A. Commentary Boxes【数学/模拟】

    [链接]:CF [题意]:对于一个数n,每次加一的代价是a,每次减一的代价是b,求被m整除时的最小代价. [分析]:分情况讨论,自己多举几个栗子. [代码]: #include<cstdio&g ...

  4. 推荐算法——基于协同过滤CF

    https://www.toutiao.com/a6643326861214482957/ 2019-01-06 18:21:09 前边我们已经介绍了推荐算法里的基于内容的推荐算法CB,今天我们来介绍 ...

  5. 索引贴——移动开发(.Net CF 停止更新)

    这是关于本人博客的技术索引贴,希望能方便的让您阅读到相关技术文章--不断更新中.一整理才发现,好多啊,哈哈- 一..Net CF技巧:搜集.转载一些和CF开发相关的辅助文章,比较适合初学者.开发入门者 ...

  6. 解答:CF截图保存在哪

    为什么80%的码农都做不了架构师?>>>    大家玩CF(穿越火线)的时候遇到精彩的画面总希望截图保存下来,然而有些游戏玩家截图后却不知道CF截图保存在哪!这不得不说是个悲剧,但是 ...

  7. CF里面的资源载入问题

    前一段时间已经发现CF在载入资源的时候会怪怪的,但是这一段时间都不曾记起要对这个问题研究一下.最近又发现这个问题了,实在是恼火.俗话说择日不如撞日(粤语),唉,就今天啦.这个问题是在VS2k5里面调试 ...

  8. [CF.Skills]播放嵌入资源的声音文件

    [CF.Skills]播放嵌入资源的声音文件 摘要:本文阐述了在Windows Mobile中如何播放潜入资源的声音文件KeywordsPlaySound, Windows Mobile, Embed ...

  9. CF#190DIV.1

    1 /* 2 CF#190DIV.1-C 3 题意:给你n个结点的树,给这些结点标记字母AB..Z,对于标记相同的结点路径上 4 的结点的标记必须有一个是大于该标记的:问是否可以标记(A是最大标记) ...

最新文章

  1. oracle中的exists 和not exists 用法详解
  2. Oracle 总复习
  3. 天龙八部3d最新服务器,天龙八部3DIOS正版服务器整合互通公告
  4. java vue20.2.2浏览器_支持 Java 15!Java 开发工具 IntelliJ IDEA 2020.2发布
  5. centos7.3 编译安装 git 2.13
  6. OSPF协议概述(一)
  7. Java Spring-Bean
  8. JavaFx系列(二) Thread顯示進度窗的對話框
  9. 学java后学python,宁波学习java还是python(孩子学Python怎么样)
  10. 一文教会你使用Markdown来制作一份简洁明了的求职简历
  11. linux 检查文件更新,Linux系统文件系统优化及磁盘检查
  12. Unity3D角色换装及换装编辑器
  13. 2021年最值得推荐的29个开源软件,想提升自己的程序员赶快收藏
  14. 【HTML+CSS】自定义字体
  15. 在CentOS7下的OpenCV环境搭建与基于C++的人脸辨认(Face Recognition)参考指南
  16. 【每日新闻】桥水达里奥:人工智能造成贫富差距 | 国产x86处理器开始生产:基于AMD Zen架构...
  17. Java面向对象练习题
  18. Mission Planner初学者安装调试教程指南(APM或PIX飞控)1——下载与版本
  19. MATLAB 串口通信
  20. 糟糕,手机密码不保!剑桥大学新研究,用AI算法“监听”手机打字,触摸屏也中招...

热门文章

  1. 继往开来,我们一直在路上!
  2. Python 闭包 (closure)深入解析
  3. 最新系统漏洞--Google Golang竞争条件漏洞
  4. 2021-2027中国雄烯二酮市场现状研究分析与发展前景预测报告
  5. java验证码识别库
  6. 【前端学习笔记】仅用CSS实现图片轮播效果
  7. 苹果手机Java在那_苹果手机相机设置在哪里 怎么设置【图文教程】
  8. WebKit浏览器编译——开启宏定义
  9. Android之自定义EditText光标和下划线颜色
  10. MPEG2、MPEG4、H264的差异