codeforces_724C_Ray Tracing
2 seconds
256 megabytes
standard input
standard output
There are k sensors located in the rectangular room of size n × m meters. The i-th sensor is located at point (xi, yi). All sensors are located at distinct points strictly inside the rectangle.
Opposite corners of the room are located at points (0, 0) and (n, m). Walls of the room are parallel to coordinate axes.
At the moment 0, from the point (0, 0) the laser ray is released in the direction of point (1, 1). The ray travels with a speed of meters per second. Thus, the ray will reach the point (1, 1) in exactly one second after the start.
When the ray meets the wall it's reflected by the rule that the angle of incidence is equal to the angle of reflection. If the ray reaches any of the four corners, it immediately stops.
For each sensor you have to determine the first moment of time when the ray will pass through the point where this sensor is located. If the ray will never pass through this point, print - 1 for such sensors.
The first line of the input contains three integers n, m and k (2 ≤ n, m ≤ 100 000, 1 ≤ k ≤ 100 000) — lengths of the room's walls and the number of sensors.
Each of the following k lines contains two integers xi and yi (1 ≤ xi ≤ n - 1, 1 ≤ yi ≤ m - 1) — coordinates of the sensors. It's guaranteed that no two sensors are located at the same point.
Print k integers. The i-th of them should be equal to the number of seconds when the ray first passes through the point where the i-th sensor is located, or - 1 if this will never happen.
3 3 4
1 1
1 2
2 1
2 2
1
-1
-1
2
3 4 6
1 1
2 1
1 2
2 2
1 3
2 3
1
-1
-1
2
5
-1
7 4 5
1 3
2 2
5 1
5 3
4 3
13
2
9
5
-1 题意:n*m的矩阵,从(0,0)沿45度角射出一束光,速度为根号2,碰到边界反射,到角上结束。k个点,分别输出光到每个点的时间. 一段一段的模拟。
每个点y-x和y+x为定值,用两个vector存点,v1[b],v2[b],这样在模拟每一段线段的时候就不用遍历整个点的集合。只需要遍历当前k和b下的vector中的点。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
using namespace std; int n,m,t; struct Node
{
int num;
int x,y; }; Node getPoint(Node st,int k)
{
Node p;
if(k*(-st.x)+st.y!=st.y&&k*(-st.x)+st.y>=&&k*(-st.x)+st.y<=m)
{
p.x=;
p.y=k*(-st.x)+st.y;
return p;
}
if(k*(n-st.x)+st.y!=st.y&&k*(n-st.x)+st.y>=&&k*(n-st.x)+st.y<=m)
{
p.x=n;
p.y=k*(n-st.x)+st.y;
return p;
}
if((-st.y+k*st.x)/k!=st.x&&(-st.y+k*st.x)/k>=&&(-st.y+k*st.x)/k<=n)
{
p.x=(-st.y+k*st.x)/k;
p.y=;
return p;
}
if((m-st.y+k*st.x)/k!=st.x&&(m-st.y+k*st.x)/k>=&&(m-st.y+k*st.x)/k<=n)
{
p.x=(m-st.y+k*st.x)/k;
p.y=m;
return p;
}
} bool isEnd(int x,int y)
{
if(x==n&&y==)
return ;
if(x==n&&y==m)
return ;
if(x==&&y==m)
return ;
return ;
} int getCost(int sx,int sy,int k,int tmpx,int tmpy)
{
int b=sy-k*sx;
if(tmpy!=k*tmpx+b)
return -;
return abs(tmpx-sx);
} long long ans[];
vector<Node> v1[];
vector<Node> v2[];
int main()
{
scanf("%d%d%d",&n,&m,&t);
/*Node a;
a.x=3;
a.y=3;
Node b=getPoint(a,-1);
cout<<b.x<<" "<<b.y<<endl;*/
int all=;
for(int i=; i<t; i++)
{
Node node;
node.num=i;
scanf("%d%d",&node.x,&node.y);
int b1=node.y-node.x+;
int b2=node.y+node.x;
v1[b1].push_back(node);
v2[b2].push_back(node);
all++;
}
//for(int i=0;i<v2[6].size();i++)
// cout<<v2[6][i].num<<" "<<v2[6][i].x<<" "<<v2[6][i].y<<endl;
Node st;
st.x=;
st.y=;
int cnt=;
long long time=;
while(!isEnd(st.x,st.y))
{
int k;
if(cnt%)
k=-;
else
k=;
cnt++;
Node en=getPoint(st,k);
int b=st.y-k*st.x;
if(k==)
{
b+=;
for(int i=; i<v1[b].size(); i++)
{
if(ans[v1[b][i].num]==)
{
int cost=getCost(st.x,st.y,k,v1[b][i].x,v1[b][i].y);
ans[v1[b][i].num]=time+cost;
}
}
}
if(k==-)
{
for(int i=; i<v2[b].size(); i++)
{
if(ans[v2[b][i].num]==)
{
int cost=getCost(st.x,st.y,k,v2[b][i].x,v2[b][i].y);
ans[v2[b][i].num]=time+cost;
}
}
}
time+=abs(en.x-st.x);
st=en;
}
//cout<<"cnt:"<<cnt<<endl;
for(int i=; i<all; i++)
if(ans[i]==)
printf("-1\n");
else
printf("%I64d\n",ans[i]);
return ;
}
codeforces_724C_Ray Tracing的更多相关文章
- 如何利用ETW(Event Tracing for Windows)记录日志
ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统.由于采用内核(Kernel)层面的缓冲和日志记录机制,所以ETW提供了一种非常高效的事 ...
- #研发解决方案介绍#Tracing(鹰眼)
郑昀 最后更新于2014/11/12 关键词:GoogleDapper.分布式跟踪.鹰眼.Tracing.HBase.HDFS. 本文档适用人员:研发 分布式系统为什么需要 Tracing? ...
- OpenCascade Ray Tracing Rendering
OpenCascade Ray Tracing Rendering eryar@163.com 摘要Abstract:OpenCascade6.7.0中引入了光线跟踪算法的实现.使用光线跟踪算法可实现 ...
- (ETW) Event Tracing for Windows 入门 (含pdf下载)
内容提纲 • ETW 介绍 • ETW 使用 • ETW 监控本机Demo • ETW 监控远程机器的思路 • 底层类库:EventSource 介绍 • 底层类库:TraceEvent 介绍 ETW ...
- 使用 Web Tracing Framework 分析富 JS 应用的性能
来自谷歌的 Web Tracing Framework 包含一组工具和脚本,用于 JavaScript 相关代码的性能分析.它是重 JavaScript 应用程序的理想选择,而 JavaScript ...
- NS3 日志(Logging)、命令行参数、Tracing系统概述(转载)
NS-3日志子系统的提供了各种查看仿真结果的渠道: 一.使用Logging Module 1 [预备知识]日志级别及其对应的宏 NS-3 提供了若干个日志级别来满足不同的 Debug 需求,每一级的日 ...
- 开始研究Ray tracing
几个月前面试时Boss问过我一个问题--"除了scanline渲染方法,你还知道什么其他渲染方式?",我没答出来,至今记忆犹新. 前段时间摆弄Intel VTune时看了它的示例代 ...
- [转]分布式系统为什么需要 Tracing?
分布式系统为什么需要 Tracing? 先介绍一个概念:分布式跟踪,或分布式追踪. 电商平台由数以百计的分布式服务构成,每一个请求路由过来后,会经过多个业务系统并留下足迹,并产生对各种Cach ...
- End-to-End Tracing of Ajax/Java Applications Using DTrace
End-to-End Tracing of Ajax/Java Applications Using DTrace By Amit Hurvitz, July 2007 Aja ...
随机推荐
- Spring MVC JSON自己定义类型转换(续)
前面提到了两种转换类型的方法(Spring MVC JSON自己定义类型转换),这里针对Json转换提供一种更简便的方法. 通过配置全局的日期转换来避免使用麻烦的注解. 首先用到了一个简单的日期工具类 ...
- Openlayers3 计算地图上随意两点间的距离
相应的openlayers的版本号为3.7. 主要用的接口是ol.Sphere.haversineDistance([x1,y1],[x2,y2]): 4326坐标系中计算两点距离的方式为: var ...
- C++成员对齐方式探讨
本文參考了<高质量程序设计指南--C++/C语言>一书 有不妥之处恳请指正 一.自然对齐 某些基于RISC(精简指令集)的CPU比方SPARC.PowerPC等.採用高字节和高字在低地址存 ...
- 局域网部署docker--从无到有创建自己的docker私有仓库
因为GFW的关系.国内用户在使用docker的时候,pull一个主要的镜像都拉下来.更不用说使用官方的index镜像了.差点放弃使用docker了,google了一圈.总算找到办法. 第一步:安装do ...
- POJ--3164--Command Network【朱刘算法】最小树形图
链接:http://poj.org/problem?id=3164 题意:告诉n个点坐标,m条边表示两个点之间有路.从1点開始建立一个有向图最小生成树. 朱刘算法模板题 =============== ...
- shell 例程 —— 解决redis读取稳定性
问题背景: php读取线上redis数据,常常不稳定,数据响应时有时无. 解决方法:多次读取.每次读取全部上一次没读出的数据,直到全部获取. 本文实现用shell进行多次redis数据读取, 每次取出 ...
- MySQL hash分区(四)
具体描写叙述总结请看MySQL分区(一) 样例:该样例为本人个人学习总结分享->具体说明-->有问题欢迎前来交流 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- android电池管理系统
原文:http://www.2cto.com/kf/201408/326462.html 1.概述 随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统 ...
- CSS小代码汇总整理
/**实现斑马线的表格*/table.flexme tbody tr:nth-child(2n){background-color:#D6E7FC;} /*返回偶数序的子元素*/table.flexm ...
- $(document).ready 与 window.onload的区别?
$(document).ready = function(){}; DOM树加载完成时执行,此时文件不一定都已加载完成. window.onload = function(){}; DOM树加载完成 ...