/*

光线只有遇上边界或堵塞的格子才会改变方向,所以改变方向的位置是有限的,光线的方向又最多只有四种,所以光线在循环之前改变方向的次数是O(n+m+k)级别的。我们可以模拟光线的移动。已知光线位置和光线的方向,使用二分的方法可以在O(log k)的时间复杂度内求出即将改变方向的位置和改变后的方向。


我们暂把光线的位置和方向称为光线的状态。一种状态能转移到一种且仅有一种状态。如果从状态a能转移到状态b,那么b反向后的状态能转移到a反向后的状态。所以一种状态能从一种且仅有一种状态转移而来。这就像是一种置换,所以从初始状态出发,必定会回到初始状态,并且回到初始状态之前不会重复经过某种状态。


我们对网格进行染色,有邻边的格子颜色不同,形成一个二分图。根据题目中光线反射的方式,可以发现,每当光线沿西北、东南方向前进时,只会经过一种颜色的网格,每当光线沿东北、西南方向前进时,只会经过另一种颜色的网格。所以光线在某一个格子中心时,要么只会是西北、东南方向之一,要么只会是东北、西南方向之一。


这样,如果一次循环内一个格子被重复经过,只有可能是光线以相反的两个方向进入,并且一次循环内一个格子最多被经过两次。一个格子被经过两次,所有被光线经过的格子都会被经过两次。易知,如果光线在前进过程中出现过如下两种反射,所有格子就会被经过两次。只需在模拟的过程中记录是否出现过这两种情况即可。*/

 #include<bits/stdc++.h>
#define re register
#define int long long
using namespace std;
int n,m,k,x,y,direct,ans; char s[];
set<int> s1[],s2[];
map< pair<int,int>,bool>mp;
struct node{int x,y,direct;}now;
inline int read(){
re int a=,b=; re char ch=getchar();
while(ch<''||ch>'')
b=(ch=='-')?-:,ch=getchar();
while(ch>=''&&ch<='')
a=(a<<)+(a<<)+(ch^),ch=getchar();
return a*b;
}
inline pair<node,int> cal(node x){
node k;
set<int>::iterator data;
switch(x.direct)
{
case :
{
data=s1[x.x-x.y+m+].lower_bound(x.x);data--;
k.x=x.x-abs(*data-x.x)+;
k.y=x.y-abs(*data-x.x)+;
if(mp[make_pair(k.x-,k.y)]&&mp[make_pair(k.x,k.y-)])k.direct=;
else if(mp[make_pair(k.x-,k.y)]){k.y--,k.direct=;}
else if(mp[make_pair(k.x,k.y-)]){k.x--,k.direct=;}
else k.direct=;
break; }
case :
{
data=s2[x.x+x.y].lower_bound(x.x);data--;
k.x=x.x-abs(*data-x.x)+;
k.y=x.y+abs(*data-x.x)-;
if(mp[make_pair(k.x-,k.y)]&&mp[make_pair(k.x,k.y+)])k.direct=;
else if(mp[make_pair(k.x-,k.y)]){k.y++,k.direct=;}
else if(mp[make_pair(k.x,k.y+)]){k.x--,k.direct=;}
else k.direct=;
break;
}
case :
{
data=s1[x.x-x.y+m+].lower_bound(x.x);
k.x=x.x+abs(*data-x.x)-;
k.y=x.y+abs(*data-x.x)-;
if(mp[make_pair(k.x+,k.y)]&&mp[make_pair(k.x,k.y+)])k.direct=;
else if(mp[make_pair(k.x+,k.y)]){k.y++,k.direct=;}
else if(mp[make_pair(k.x,k.y+)]){k.x++,k.direct=;}
else k.direct=;
break;
}
case :
{
data=s2[x.x+x.y].lower_bound(x.x);
k.x=x.x+abs(*data-x.x)-;
k.y=x.y-abs(*data-x.x)+;
if(mp[make_pair(k.x+,k.y)]&&mp[make_pair(k.x,k.y-)])k.direct=;
else if(mp[make_pair(k.x+,k.y)]){k.y--,k.direct=;}
else if(mp[make_pair(k.x,k.y-)]){k.x++,k.direct=;}
else k.direct=;
break;
}
}
return make_pair(k,abs(*data-x.x));
}
inline bool judge(node x){
node k=x;
do{
pair<node,int> l=cal(x);
ans+=l.second;
switch(l.first.direct)
{
case :if(x.direct==)return ;break;
case :if(x.direct==)return ;break;
case :if(x.direct==)return ;break;
case :if(x.direct==)return ;break;
}
x=l.first;
}while(k.x!=x.x||k.y!=x.y||k.direct!=x.direct);
return ;
}
signed main(){
n=read(),m=read(),k=read();
for(re int i=,u,v;i<=k;i++){
u=read(),v=read();
s1[u-v+m+].insert(u);
s2[u+v].insert(u);
mp[make_pair(u,v)]=;
}
for(re int i=;i<=m+;i++){
s1[m+-i].insert();
s2[i].insert();
s1[m+n-i+].insert(n+);
s2[i+n+].insert(n+);
mp[make_pair(,i)]=;
mp[make_pair(n+,i)]=;
}
for(re int i=;i<=n;i++){
s1[i+m+].insert(i);
s2[i].insert(i);
s1[i].insert(i);
s2[i+m+].insert(i);
mp[make_pair(i,)]=;
mp[make_pair(i,m+)]=;
}
x=read(),y=read();scanf("%s",s);
if(s[]=='N'&&s[]=='W') direct=;
if(s[]=='N'&&s[]=='E') direct=;
if(s[]=='S'&&s[]=='E') direct=;
if(s[]=='S'&&s[]=='W') direct=;
now.x=x,now.y=y,now.direct=direct;
now=cal(now).first;
if(!judge(now))
{
ans--;
switch(now.direct)
{
case :now.direct=;break;
case :now.direct=;break;
case :now.direct=;break;
case :now.direct=;break;
}
judge(now);
}
printf("%lld\n",ans);
}

光(mirror room)的更多相关文章

  1. 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

    我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说 一下cluster的概念,rabbitmq是erl ...

  2. 搭建自己私有的PKM系统,各家PKM大比拼。。附:构建自己熟悉的基础Docker,破解联通光猫

    Docker这容器真是很好玩!干啥都想上docker了,快疯了. 这不,最近wiz笔记开始收费,很是不爽,需要寻求新的PKM系统了.备选及落选理由如下: wiz笔记 -- 好用,顺手.要开始收费了,不 ...

  3. webform 光棒效果,删除操作弹出确定取消窗口

    鼠标移入onmouseover和鼠标移出onmouseout,代码里没大写我这也就不大写了.那首先,我们得获取Class为tr_item里的所有东西,也就是项标签里的数据.然后呢,我们定义一个oldC ...

  4. 兼容可控硅调光的一款LED驱动电路记录

    1.该款电路为兼容可控硅调光的LED驱动电路,采用OB3332为开关控制IC,拓扑方案为Buck: 2.FB1:磁珠的单位是欧姆,而不是亨利,这一点要特别注意.因为磁珠的单位是按照它在某一频率 产生的 ...

  5. 备忘:aliyun maven mirror

    <mirror>      <id>alimaven</id>      <name>aliyun maven</name>      &l ...

  6. hadoop2.7下载mirror

    http://mirror.bit.edu.cn/apache/hadoop/common/

  7. JMeter学习-034-JMeter调试工具之一---HTTP Mirror Server

    通常,编程工具IDE都提供了相应的调试模块,供开发者使用,以便更快速的定位问题所在.那么在JMeter编写测试脚本的过程中,JMeter都提供了哪些调试工具供我们使用呢? JMeter常用的调试工具有 ...

  8. 配置 Docker 加速器(Docker Hub Mirror)

    Docker 加速器是什么,我需要使用吗? 使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验.因此 DaoCl ...

  9. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)

    A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...

随机推荐

  1. 一行神奇的 javascript 代码

    写本篇文章的缘由是之前群里@墨尘发了一段js代码,如下: (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~ ...

  2. PAT甲级——A1101 Quick Sort

    There is a classical process named partition in the famous quick sort algorithm. In this process we ...

  3. 2019-9-2-C#判断文件属于文本或二进制

    title author date CreateTime categories C#判断文件属于文本或二进制 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 1 ...

  4. [转]【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动

    好久没更新博客了,今天如果没急事,准备连发三篇,完全讲解Blend最牛的元素-“FluidMoveBehavior”.我向大家保证这三章一定非常精彩,不看你肯定后悔.我相信这三篇文章发表后,国内很多s ...

  5. 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法

    1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...

  6. php冒泡算法

    1.冒泡算法 网上搜了很多,但是总是对于每次循环的边界值思路讲的比较笼统. 不是很容易被新手记住,我自己平时也是硬记下来的. 但是对于算法,硬记,时间长了还是容易忘记,所以自己写了一次,把每次思路尽量 ...

  7. java虚拟机(十)--性能监控工具测试内存溢出和死锁基本思路

    在之前就曾经简单介绍过jdk自带的性能检测工具,但是只是很入门的内容.没有真正的用过都是白扯了,面试的时候也说不过去,更别提真正 在生产环境去解决问题,所以这里我们学习一下真正解决问题的过程,最起码面 ...

  8. Django项目:CRM(客户关系管理系统)--57--47PerfectCRM实现CRM客户报名流程02

    图片另存为  16*16  名字修改为      bpm_logo.jpg /*! *bootstrap.js * * Bootstrap v3.3.7 (http://getbootstrap.co ...

  9. XSS“从1到0”

    时隔半年终于也应该更新了,之前说的每周更新也因为懒散这个借口变得遥遥无期.之所以叫这个标题,是在Freebuf上看到一篇文章,开头作者问到:“网上大多的文章标题都是XXX从0开始,可我们到底什么时候能 ...

  10. idea短信验证

    idea短信验证(短信接口:阿里云:消息中间件:activeMQ) 主要分为两步:1.创建发消息  2.创建收消息 1.创建发消息 1.1 创建maven工程 1.2 pom.xml文件导入依赖 注意 ...