/*

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

    不得不说平衡树博大精深,除了Treap,还有splay,非旋Treap和可持久化数据结构,今天先讲讲Treap,也很感谢这位大佬的博客给予我帮助:http://www.360doc.com/conte ...

  2. 【核心核心】4.Spring【IOC】注解方式

    1.导入jar包 2.创建对应的类 public interface HelloService { public void sayHello(); } /** * @Component(value=& ...

  3. HZOI20190814 B 不等式

    不等式 题目大意:求解满足$L \leqslant(S×x)mod M\leqslant R$的x最小正整数解,无解输出-1 几种部分分: $L==R$,就是$ex_gcd$; 解在$1e6$以内:搜 ...

  4. PAT甲级——A1027 Colors in Mars

    People in Mars represent the colors in their computers in a similar way as the Earth people. That is ...

  5. Django-rest Framework(三)

    今天看了drf的五个组件的源码,可读性还是很高的,只是读组件的时候要注意的是 大部分的组件都是由dispatch分发出去的,所以看源码的时候一定要抓住dispatch这条主线,一步一步看下去 一. d ...

  6. oracle基础学习(1)

    -解锁用户,需要使用dba权限conn sys/1234 as dba; alert user scott account unlock;/ --initcap方法,实现字符串首字符大写,其余字符小写 ...

  7. 一些hbase的shell查询语句

    华为bids(不想吐槽)种种原因只能用hbase shell查询,在此记录下自己探索的hbase shell 免得下次要用还得去找 scan 'ogg_sel_ioc_sv_product_name_ ...

  8. spring整合http

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接出处:https://blog.csdn.net/qq_3076499,否则保留追究法律责任的权利. 如果 ...

  9. http://codeforces.com/gym/100623/attachments H题

    http://codeforces.com/gym/100623/attachments H题已经给出来的,包括后来添加的,都累加得到ans,那么从1-ans都是可以凑出来的,如果ans<a[n ...

  10. redis教程(二)-----redis事务、记录日志到redis、分布式锁

    redis事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余 ...