/*

光线只有遇上边界或堵塞的格子才会改变方向,所以改变方向的位置是有限的,光线的方向又最多只有四种,所以光线在循环之前改变方向的次数是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. Django之模板语言(二)-----Filter

    1.其他常用的模板语言: 通过模板语言可以让前端页面显示数据,数据可以是基本数据类型,也可以是对象亦或者对象的列表,结合着模板中的for.if等配合使用. 要注意前端页面中,出现没有后端数据的情况,随 ...

  2. 【neo4j】neo4j Desktop1.1.9,windows 安装

    一.neo4j 介绍 Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储 ...

  3. error C2440 “static_cast” 无法从“void (__thiscall C* )(void)...

    1.VC6中,说可以把函数在头文件中定义为:afx_msg void OnProgress()这样 但是在VS2005及以上,要求很严格,必须函数返回值为LRESULT类型,所以在VS2005及以上, ...

  4. 732F Tourist Reform

    // CF 732F Tourist Reform // 思路:两遍tarjan // 找强联通分量 #include <bits/stdc++.h> using namespace st ...

  5. [Swoole系列入门教程 2] 入门级的Swoole的demo.服务端与客户端

  6. 使用cmd查看windows端口占用情况,并关闭应用

    在做开发的时候常常会遇到端口被占用的问题,下面是我在网上找的比较好用的一种关闭占用端口进程的方法 1.在运行中输入cmd打开dos命令窗口,比如我想找到端口8888对应的PID(通过PID找到相应的进 ...

  7. java中通过jacob调用dts进行数据导入导出

    在一个项目中需要金蝶软件对接,但是业务服务器和财务服务器相隔很远(中间经过好几台服务器,有内网也有外网),从一个内网向另一个内网中传输时,需要外网辅助,因为不让原始数据受污染,使用了DTS数据同步到另 ...

  8. 原生js实现头像大屏随机显示

    效果如下图所示: 一.html部分 <div class="myContainer"> <ul> <li class="first" ...

  9. ms12-020复现-xp蓝屏

    漏洞名:MS12-020(全称:Microsoft windows远程桌面协议RDP远程代码执行漏洞) 介绍:RDP协议是一个多通道的协议,让用户连上提供微软终端机服务的电脑. windows在处理某 ...

  10. java基础之集合(Set,Map,List)总结

    一.Collection接口 1.Collection接口两个子接口     -List接口         -ArrayList:         -Vector:         -LinkedL ...