[CF1236D] Alice and the Doll

Description

\(N \times M\)网格,有 \(K\) 个格子里有障碍物。每次经过一个格子的时候只能直走或者右转一次。初态在 \((1,1)\) 格子向上。求是否存在一条路径经过所有无障碍格子恰好一次。

Solution

最优的走法是遇到障碍或者边界就右转,否则直走。

走过一排格子相当于挪动边界线。

这两个结论仔细品味起来很挺有深度的。

然后暴力模拟就可以了,找障碍物的过程可以用 set 优化。

这题的坐标系好像有点奇怪,SB的我就这么搞反坐标WA了一发。然后忘记开longlong又WA了一发。

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100005; int n,m,k,t1,t2,t3,t4,lx,ly,ux,uy,dir,ans=1;
set <int> sx[N],sy[N]; int FindIncX(int x,int y)
{
return min(ux,*sy[y].lower_bound(x));
} int FindDecX(int x,int y)
{
return max(lx,*(--sy[y].lower_bound(x)));
} int FindIncY(int x,int y)
{
return min(uy,*sx[x].lower_bound(y));
} int FindDecY(int x,int y)
{
return max(ly,*(--sx[x].lower_bound(y)));
} signed main()
{
cin>>n>>m>>k;
lx=0;
ly=0;
ux=n+1;
uy=m+1;
for(int i=1; i<=m; i++)
{
sy[i].insert(0);
sy[i].insert(n+1);
}
for(int i=1; i<=n; i++)
{
sx[i].insert(0);
sx[i].insert(m+1);
}
for(int i=1; i<=k; i++)
{
cin>>t1>>t2;
sx[t1].insert(t2);
sy[t2].insert(t1);
}
dir=0;
int x=1,y=1;
while(true)
{
int nx,ny;
switch(dir)
{
case 0:
nx=x;
ny=FindIncY(x,y)-1;
break;
case 1:
ny=y;
nx=FindIncX(x,y)-1;
break;
case 2:
nx=x;
ny=FindDecY(x,y)+1;
break;
case 3:
ny=y;
nx=FindDecX(x,y)+1;
break;
}
if(x==nx && y==ny)
{
dir=(dir+1)%4;
switch(dir)
{
case 0:
nx=x;
ny=FindIncY(x,y)-1;
break;
case 1:
ny=y;
nx=FindIncX(x,y)-1;
break;
case 2:
nx=x;
ny=FindDecY(x,y)+1;
break;
case 3:
ny=y;
nx=FindDecX(x,y)+1;
break;
}
if(x==nx && y==ny)
break;
}
ans += abs(nx-x) + abs(ny-y);
switch(dir)
{
case 0:
lx=max(lx,nx);
break;
case 1:
uy=min(uy,ny);
break;
case 2:
ux=min(ux,nx);
break;
case 3:
ly=max(ly,ny);
break;
}
x=nx;
y=ny;
}
//cout<<ans<<endl;
if(ans==n*m-k)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}

[CF1236D] Alice and the Doll - 模拟,STL的更多相关文章

  1. CSP 201612-3 权限查询 【模拟+STL】

    201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...

  2. 【CF1236D】Alice and the Doll(set)

    题意:给定一个n*m的网格,其中k格有障碍 周驿东从(1,1)出发面朝右,每次行动前他可以选择顺时针旋转90度或不旋转,然后向自己朝向的位置走1格 问他能否不重复不遗漏的走过所有非障碍格 n,m,k& ...

  3. CodeForces 705C Thor (模拟+STL)

    题意:给定三个操作,1,是x应用产生一个通知,2,是把所有x的通知读完,3,是把前x个通知读完,问你每次操作后未读的通知. 析:这个题数据有点大,但可以用STL中的队列和set来模拟这个过程用q来标记 ...

  4. 2018.08.28 集合堆栈机(模拟+STL)

    描述 中学数学里集合的元素往往是具体的数字,比如A = {1,2,3},B = {}(空集)等等.但是要特别注意,集合的元素也可以是另一个集合,比如说C = {{}},即说明C有且仅有一个元素--空集 ...

  5. 【bzoj3291】Alice与能源计划 模拟费用流+二分图最大匹配

    题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...

  6. 用数组模拟STL中的srack(栈)和queue(队列)

    我们在理解stack和queue的基础上可以用数组来代替这两个容器,因为STL中的stack和queue有可能会导致程序运行起来非常的慢,爆TLE,所以我们使用数组来模拟他们,不仅可以更快,还可以让代 ...

  7. Codeforces Round #285 (Div. 2) A B C 模拟 stl 拓扑排序

    A. Contest time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  8. hdoj 1702 ACboy needs your help again!【数组模拟+STL实现】

    ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  9. UVA 246 - 10-20-30 (模拟+STL)

    UVA 246 - 10-20-30 题目链接 题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,假设有牌堆形成了下面3种情况(按顺序推断): 1.头两张+尾一张和为10或20 ...

随机推荐

  1. 制作MySQL RPM安装包Spec

    适用环境: 数据库版本:MySQL 操作系统:CentOS 7 制作思路: 将数据库初始化和配置工作放到安装脚本中方便定制: 1.打包MySQL应用目录 2.不自动生成配置文件 3.不自动生成数据目录 ...

  2. IP后面带/30 /29 /27等是什么意思?

    那个代表你网络的位数,也就是能判断子网掩码.比如30 说明就是11111111.11111111.11111111.11111100 (30个1,2个0)然后转换成十进制就是255.255.255.2 ...

  3. SecureCRT 按退格键出现 ^H 的解决办法  

    问题如图 打开SecureCRT 界面,最上方工具栏 1.选项→会话选项 2.终端→仿真→映射键 3.其他选项→勾选 Backspace 发送 delete(B) 4.点击确定即可 另外在不可编辑状态 ...

  4. JN_0017:在当前目录运行CMD

    运行npm的时候,每次都要cd到目录,很麻烦,所以总结了三种在当前目录下直接打开cmd窗口的方法,供以后开发时参考,相信对其他人也有用. 方法一 在当前目录按住shift再右键. 会看到右键菜单里有一 ...

  5. 关于BaseServlet的使用

    一篇很棒的参考 https://blog.csdn.net/weixin_42425970/article/details/84279257

  6. MVC开发之Razor的使用

    一.运用布局和视图起始文件 布局的使用,可以简化视图,允许用户创建能够运用于多个视图的通用HTML,并使得维护更加容易.下面是一个简单的例子: 域模型类: public class Product { ...

  7. 【database】oracle集合 - Associative Arrays、Varrays、Nested Tables

    前言 参考oracle官方文档:PL/SQL Language Reference 11g Release 2  -  5 PL/SQL Collections and Records 可以去看下文档 ...

  8. Tomcat 后台war部署上传shell

    tomcat的后台登录的两个目录为: /admin /manager/html 如果版本过高,只有采用弱密码的方式进后台: 有些tomcat采用默认的用户名和密码(用户名:admin,密码:空): 或 ...

  9. java网页日期选择框对应的星期有误

    · 我用java写了个星期查询代码,有的日期对有的日期错,求帮忙看看哪里有问题!! import java.util.*;public class Test1 {public static void ...

  10. 常用命令 在linux下

    1.拷贝某个目录及其下的所有的文件到另外一个目录 语法:cp -r <source directory name>/ <destination directory name>/ ...