
codeforces1236D 2100分模拟
发布日期:2021-05-06 15:22:50
浏览次数:15
分类:原创文章
本文共 2806 字,大约阅读时间需要 9 分钟。
题意:
的迷宫,有
个格子是障碍,移动的方向是上下左右。
每个格子只能经过一次。
每个格子在经过时若要变换方向,只能向右变换一次。
问从 出发,能否遍历所有非障碍的格子。
数据范围: ,
。
题解:
走的轨迹大致是一个螺旋形。
在可以直走和拐弯时,选择直走,因为拐弯后不可能走到原来直走的格子上。
用set存储障碍。然后二分障碍的位置就好了。
如果可以完成任务,那么走的路径长度是 。
感受:
在AC之前能不看数据就不看数据。
代码:
#include<bits/stdc++.h>using namespace std ;typedef long long ll ;const int maxn = 1e5 + 5 ;int n , m , k ;set<int> row[maxn] , col[maxn] ;ll s = 0 ;int r , c , d ;int ur , dr , lc , rc ;bool can(){ if(d == 0) { auto it = row[r].upper_bound(c) ; int nxt ; if(it == row[r].end()) nxt = m ; else nxt = *it - 1 ; nxt = min(nxt , rc - 1) ; if(nxt <= c) return 0 ; else return 1 ; } else if(d == 1) { auto it = col[c].upper_bound(r) ; int nxt ; if(it == col[c].end()) nxt = n ; else nxt = *it - 1 ; nxt = min(nxt , dr - 1) ; if(nxt <= r) return 0 ; else return 1 ; } else if(d == 2) { auto it = row[r].upper_bound(c) ; if(it != row[r].begin()) it -- ; int nxt ; if(it == row[r].end() || (*it) > c) nxt = 1 ; else nxt = (*it) + 1 ; nxt = max(nxt , lc + 1) ; if(nxt >= c) return 0 ; else return 1 ; } else { auto it = col[c].upper_bound(r) ; if(it != col[c].begin()) it -- ; int nxt ; if(it == col[c].end() || (*it) > r) nxt = 1 ; else nxt = (*it) + 1 ; nxt = max(nxt , ur + 1) ; if(nxt >= r) return 0 ; else return 1 ; }}void work(){ if(d == 0) { auto it = row[r].upper_bound(c) ; int nxt ; if(it == row[r].end()) nxt = m ; else nxt = *it - 1 ; nxt = min(nxt , rc - 1) ; s += nxt - c ; c = nxt ; rc = min(rc , c) ; } else if(d == 1) { auto it = col[c].upper_bound(r) ; int nxt ; if(it == col[c].end()) nxt = n ; else nxt = *it - 1 ; nxt = min(nxt , dr - 1) ; s += nxt - r ; r = nxt ; dr = min(dr , r) ; } else if(d == 2) { auto it = row[r].upper_bound(c) ; if(it != row[r].begin()) it -- ; int nxt ; if(it == row[r].end() || (*it) > c) nxt = 1 ; else nxt = (*it) + 1 ; nxt = max(nxt , lc + 1) ; s += c - nxt ; c = nxt ; lc = max(lc , c) ; } else { auto it = col[c].upper_bound(r) ; if(it != col[c].begin()) it -- ; int nxt ; if(it == col[c].end() || (*it) > r) nxt = 1 ; else nxt = (*it) + 1 ; nxt = max(nxt , ur + 1) ; s += r - nxt ; r = nxt ; ur = max(ur , r) ; }}void solve(){ r = 1 , c = 1 , d = 0 ; ur = 1 , dr = n + 1 , lc = 0 , rc = m + 1 ; while(1) { if(can()) work() ; else { d = (d + 1) % 4 ; if(can()) work() ; else break ; } } }int main(){ scanf("%d%d%d" , &n , &m , &k) ; for(int i = 1 ; i <= k ; i ++) { int r , c ; scanf("%d%d" , &r , &c) ; row[r].insert(c) ; col[c].insert(r) ; } solve() ; if(s == ll(n) * m - k - 1) printf("Yes\n") ; else printf("No\n") ; return 0 ;}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月23日 18时33分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
文本情感分类
2019-03-04
二叉树的深度
2019-03-04
Python模块_os文件_目录方法
2019-03-04
前端学习笔记63-行高
2019-03-04
Java中return、continue和break的区别(案例详解)
2019-03-04
4.监控redis(redis_exporter)
2019-03-04
部署kuboard3 管理工具
2019-03-04
SpringBoot中使用Mybatis访问MySQL数据库(使用xml方式)
2019-03-04
Dubbo学习之简单的demo(xml版)
2019-03-04
Dubbo学习之简单的demo(纯java版)
2019-03-04
SpringBoot之RabbitMQ的简单使用的Demo
2019-03-04
Codeforces Round #672 (Div. 2) 1420A 【思维】 题解
2019-03-04
ES6的Set
2019-03-04
Algorithms Unlocked
2019-03-04
虚拟机VMware安装CentOS8.1系统
2019-03-04
Linux发行版之CentOS8的使用
2019-03-04
python中的map( )函数及lambda()函数简介
2019-03-04
2020-05-26-力扣刷刷4-面试题10- I. 斐波那契数列
2019-03-04
SQL Sever 学习笔记三——聚合查询
2019-03-04
SQL Sever学习笔记四——分组—GROUP BY 子句
2019-03-04