[CodeForces] 274E Mirror Room
题意翻译
有一个n*m的格子图,其中有一些是黑色的,另一些为白色。
从某个白色格子的中心点向左上(NW),左下(SW),右上(NE),右下(SE)四个方向中的一个发出一束光线,若光线碰到黑色格子或者墙壁(即边界)会反射。反射情况如图所示:

我们不难发现,光线能穿过的格子总数是可以算出的。假如光线经过了某个格子的中心,则称光线经过了这个格子。求光线经过的格子总数。
由于答案可能很大,请使用long long的C++选手注意:请勿使用%lld,推荐cout或者%I64d
题目描述
Imagine an n×mn×m grid with some blocked cells. The top left cell in the grid has coordinates (1,1)(1,1) and the bottom right cell has coordinates (n,m)(n,m) . There are kk blocked cells in the grid and others are empty. You flash a laser beam from the center of an empty cell (x_{s},y_{s})(xs,ys) in one of the diagonal directions (i.e. north-east, north-west, south-east or south-west). If the beam hits a blocked cell or the border of the grid it will reflect. The behavior of the beam reflection in different situations is depicted in the figure below.

After a while the beam enters an infinite cycle. Count the number of empty cells that the beam goes through at least once. We consider that the beam goes through cell if it goes through its center.
输入输出格式
输入格式:
The first line of the input contains three integers nn , mm and kk (1<=n,m<=105,0<=k<=105) . Each of the next kk lines contains two integers(1<=xi<=n,1<=yi<=m) indicating the position of the ii -th blocked cell.
The last line contains(1<=xs<=n,1<=ys<=m) and the flash direction which is equal to "NE", "NW", "SE" or "SW". These strings denote directions (-1,1)(−1,1) , (-1,-1)(−1,−1) , (1,1)(1,1) , (1,-1)(1,−1) .
It's guaranteed that no two blocked cells have the same coordinates.
输出格式:
In the only line of the output print the number of empty cells that the beam goes through at least once.
Please, do not write the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
输入输出样例
输入样例#1:
3 3 0
1 2 SW
输出样例#1:
6
输入样例#2:
7 5 3
3 3 4
3 5 3
2 1 SE
输出样例#2:
14
题目分析
恶心啊。
根据惯例我们先列一下需要考虑的问题:
1.四种方块的反射状态
2.在一定时间后光线会重复循环,此时终止
3.数据范围带来的不能用邻接矩阵存图的麻烦
4.坐标从0开始很不好处理
写吧,细节解决方案看代码
Code
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std; const int MAXN = 1e5 + ;
const int INF = 0x3f3f3f3f; int n,m,k;
int sx,sy,sd;
vector<int> block[MAXN];
string S;
bool flag; void add(int x,int y) {
block[x].push_back(y);
return;
} void scan() {
scanf("%d%d",&n,&m,&k);
scanf("%d%d%s",&sx,&sy,&S);
if(S == "NW") sd = ;
else if(S == "NE") sd = ;
else if(S == "SW") sd = ;
else if(S == "SE") sd = ;
int x,y;
for(int i = ;i <= k;i++) {
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i = ;i <= n;i++) add(i,),add(i,m + );
for(int j = ;j <= n;j++) add(,j),add(n + ,j);
add(,);add(n + ,m + );
return;
} void dir_judge(int x,int y,int &d) {
if(d == ) {
if(!getblock(x-,y-)) return;
else {
int opt = getblock(x,y-) - getblock(x-,y);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
} else if(d == ) {
if(!getblock(x-,y+)) return;
else {
int opt = getblock(x-,y) - getblock(x,y+);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
} else if(d == ) {
if(!getblock(x+,y-)) return;
else {
int opt = getblock(x,y-) - getblock(x+,y);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
} else if(d == ) {
if(!getblock(x+,y+)) return;
else {
int opt = getblock(x-,y) - getblock(x,y-);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
}
}
/*
NW 1 NE 2 SW 3 SE 4
*/ void start() {
int x = sx,y = sy,d = sd;
while(!flag) {
dir_judge(x,y,d);
}
} main() {
scan();
start();
}
[CodeForces] 274E Mirror Room的更多相关文章
- [Codeforces 274E]:Mirror Room(模拟)
题目传送门 题目描述 有一个$n\times m$的格子图,其中有一些是黑色的,另一些为白色.从某个白色格子的中心点向左上($NW$),左下($SW$),右上($NE$),右下($SE$)四个方向中的 ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)
A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...
- [codeforces 241]C. Mirror Box
[codeforces 241]C. Mirror Box 试题描述 Mirror Box is a name of a popular game in the Iranian National Am ...
- Codeforces Round VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM 暴力出奇迹!
VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM Time Lim ...
- Codeforces Bubble Cup 8 - Finals [Online Mirror] B. Bribes lca
题目链接: http://codeforces.com/contest/575/problem/B 题解: 把链u,v拆成u,lca(u,v)和v,lca(u,v)(v,lca(u,v)是倒过来的). ...
- Codeforces Bubble Cup 8 - Finals [Online Mirror]H. Bots 数学
H. Bots Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/H Desc ...
- Codeforces Bubble Cup 8 - Finals [Online Mirror] D. Tablecity 数学题
D. Tablecity Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/D ...
- Codeforces Bubble Cup 8 - Finals [Online Mirror] F. Bulbo DP
F. Bulbo Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/F Des ...
- Codeforces 1182D Complete Mirror [树哈希]
Codeforces 中考考完之后第一个AC,纪念一下qwq 思路 简单理解一下题之后就可以发现其实就是要求一个点,使得把它提为根之后整棵树显得非常对称. 很容易想到树哈希来判结构是否相同,而且由于只 ...
随机推荐
- 5分钟Serverless实践 | 构建无服务器图片鉴黄Web应用
Serverless是什么 Serverless中文译为“无服务器”,最早可以追溯到2012年Ken Fromm发表的<Why The Future Of Software And Apps I ...
- 将ppt转换成PDF
import sys import os import glob import win32com.client def convert(files, formatType = 32): powerpo ...
- 安卓BitmapFactory.decodeStream()返回null的问题解决方法
问题描述: 从网络获取图片,数据为InputStream流对象,然后调用BitmapFactory的decodeStream()方法解码获取图片,返回null. 代码如下: private Bitma ...
- ※归并排序(merge sort)
/** 归并排序:通常以递归的方式来实现,它反复将所处理的数组分成两半,并分别对这两半进行排序, 最后再把经过排序的数组归并在一起. */ 归并排序的伪代码实现: 将数组分为两半 对左半部分排序 对右 ...
- 2243: [SDOI2011]染色(树链剖分+线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 8400 Solved: 3150[Submit][Status ...
- [Swift通天遁地]六、智能布局-(6)其他几种约束关系:父视图/Corner/Edge/AnchorAndFillEdge
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- longpo的回文
啊...比赛的时候输入打错了,结束之后还照着题解把DP部分重构了一遍然而还是WA...样例都没过,然后直接输了-1 明显的DP...而且数据范围这么小,显然怎么搞都可以... 而且这样的回文的DP是很 ...
- $P1596 [USACO10OCT]湖计数Lake Counting$
\(problem\) 其实这题吧\(DFS\)好写一点(大雾 所以就不讲\(DFS\)了 em \(BFS\)的话 主要是 判重. 方向. 队列.(没了吧 至于位置 用两个队列?还是\(pair\) ...
- 配置Oracle数据库的开机自启动
每当数据库服务器重启后,都要重新启动数据库的监听和实例,特别是在服务器断电重启.例行维护性的场景下.能否像Windows服务器一样,让实例和监听随着服务的启动而启动呢?答案当然是肯定的,我们可以利用O ...
- Oracle 递归的写法(start with) 以及where条件作用域
先转一个讲Oracle递归讲得非常透彻的文章: http://blog.csdn.net/weiwenhp/article/details/8218091 前言:嗯,这也是一个前人挖坑,后人来填的故事 ...