原题链接:http://codeforces.com/problemset/problem/848/B

题意:好多个人分别从x,y轴不同位置不同时间往垂直坐标轴方向移动,一旦相遇他们转向,问所有人的到达边缘的位置。

思路:即使相遇后没有改变方向,终点位置还是不变的。

1.首先可以根据开始移动的时间将每个人的初始位置往后移动ti单位,这样就可以看作所有人都同时开始移动了。

2.接下来,假设两个人i,j在t时刻(x, y)处相撞,那么可以推知两个人的初始位置分别为(x-t, y),(x, y-t),由此可知两个点的初始x+y(在考虑1的条件下为x+y-t)是相等的

3.如果我们画图分析一些样例,可以发现,初始x+y相等的若干个点:他们在相撞之后,最后落在边缘的位置,从左上到右上再到右下,依次和初始位置从左上到左下再到右下的顺序是一样的,即如果我们顺时针将终点标号,逆时针将x+y相等的起点标号,那么起点与对应的终点标号恰好是一样的。

那么我们可以先根据(x-t)排序并根据初始坐标逆时针排序,在最后记录答案时只需要在找到相等x+y的点(区间)之后,得到y轴出发的点的数量k,每个点对应终点就是排序好的位置往后第k个点,超出范围的取个模就行了。

AC代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 1e5 + ;
struct Node {
int x, y;
int val;
int g;
}node[MAXN], res[MAXN];
int p[MAXN];
bool cmp(int a, int b) {
if (node[a].val == node[b].val) {
if (node[a].x == node[b].x)
return node[a].y>node[b].y;
return node[a].x<node[b].x;
}
return node[a].val<node[b].val;
}
int main()
{
for (int i = ;i<MAXN;i++) p[i] = i;
int n, w, h;
int pos, T, type;
scanf("%d %d %d", &n, &w, &h);
for (int i = ;i<n;i++) {
scanf("%d %d %d", &type, &pos, &T);
if (type == ) {
node[i].x = pos;
node[i].y = ;
node[i].val = pos - T;
}
else {
node[i].x = ;
node[i].y = pos;
node[i].val = pos - T;
}
}
sort(p, p + n, cmp);
node[n].val = -*MAXN;
int first_y = -, last_y = -, first_x = -, last_x = -;
int v = node[p[]].val, goal;
for (int i = ;i<=n;i++) {
if (v != node[p[i]].val) {
int s = last_y - first_y + ;
int t = last_x - first_y + ;
int j = first_y;
if (first_y == - && last_y == -) {
s = ;
j = first_x;
}
if (first_x == - && last_x == -) {
s = ;
//j=first_y;
}
for (;j <= last_x;j++) {
goal = j + s; if (goal>last_x) goal -= t;//这个操作相当于取模
node[p[j]].g = p[goal];
} v = node[p[i]].val;
first_y = -, last_y = -, first_x = -, last_x = -;
}
if (node[p[i]].x == ) {
if (first_y == -) first_y = i;
last_y = i;
}
else {
if (first_x == -) first_x = i; }last_x = i;//把last_x拿到外面比较妥当,防止判断j<=last_x时last_x==-1的情况
}
for (int i = ;i<n;i++) {
goal = node[p[i]].g;
if (node[goal].x == ) res[p[i]].x = w;
else res[p[i]].x = node[goal].x; if (node[goal].y == ) res[p[i]].y = h;
else res[p[i]].y = node[goal].y;
}
for (int i = ;i<n;i++)
printf("%d %d\n", res[i].x, res[i].y); }

codeforces 848B - Rooter's Song(构造+几何)的更多相关文章

  1. codeforces 848B Rooter's Song 思维题

    http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标 ...

  2. Codeforces 848B Rooter's Song(分类+模拟)

    题目链接 Rooter's Song 题意  有n个舞者站在x轴上或y轴上,每个人有不同的出发时间.x轴上的舞者垂直x轴正方向移动,y轴上的舞者垂直y轴正方向移动. 当x轴的舞者和y轴的舞者相遇时,他 ...

  3. [CodeForces - 848B] Rooter's Song 思维 找规律

    大致题意: 有一个W*H的长方形,有n个人,分别站在X轴或Y轴,并沿直线向对面走,第i个人在ti的时刻出发,如果第i个人与第j个人相撞了 那么则交换两个人的运动方向,直到走到长方形边界停止,问最后每个 ...

  4. codeforces 848B Rooter's Song

    题目链接 正解:排序+模拟. 我们注意到两个点碰撞的必要条件,$pi+tj=pj+ti$,移项以后发现就是$pi-ti=pj-tj$,那么我们可以把$p-t$相同的点分为同一组. 然后我们还可以发现一 ...

  5. ACM: CodeForces 140A New Year Table-数学几何

    CodeForces 140A New Year Table Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  6. Educational Codeforces Round 10 B. z-sort 构造

    B. z-sort 题目连接: http://www.codeforces.com/contest/652/problem/B Description A student of z-school fo ...

  7. Codeforces 707C Pythagorean Triples(构造三条边都为整数的直角三角形)

    题目链接:http://codeforces.com/contest/707/problem/C 题目大意:给你一条边,问你能否构造一个包含这条边的直角三角形且该直角三角形三条边都为整数,能则输出另外 ...

  8. Codeforces 1246D/1225F Tree Factory (构造)

    题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...

  9. Codeforces - 1202D - Print a 1337-string... - 构造

    https://codeforces.com/contest/1202/problem/D 当时想的构造是中间两个3,然后前后的1和7组合出n,问题就是n假如是有一个比较大的质数因子或者它本身就是质数 ...

随机推荐

  1. oracle 11g不能导出空表的解决方法

    在oracle 11g r2中,发现传统的exp居然不能导出空的表,然后查询一下,  发现需要如下的步骤去搞,笔记之.    oracle 11g 新增了一个参数:deferred_segment_c ...

  2. 《图解设计模式》读书笔记9-1 Flyweight模式

    目录 模式简介 示例代码 代码功能与实现思路 类图 代码 结果图示分析 模式角色和类图 角色 类图 拓展思路 对多个地方产生影响 什么要共享,什么不要共享 垃圾回收 模式简介 Flyweight是轻量 ...

  3. 当在浏览器中输入一个url后回车,后台发生了什么?比如输入url后,你看到了百度的首页,那么这一切是如何发生的呢?

    简单来书有以下步骤: 查找域名对应的IP地址.这一步会依次查找浏览器缓存,系统缓存,路由器缓存,ISPDNS缓存,13台根域名服务器. 向IP对应的服务器发送请求. 服务器响应请求,发回网页内容. 浏 ...

  4. python接口自动化:响应内容中json字符串对象的处理

    实现代码如下: import json #定义一个字典.一个列表.两个字符串({}中必须是双引号) di1={"} di2=[{"}] di3='{"name" ...

  5. 【minicap】基于图像识别的手机端UI自动化测试的截图方式更新

    minicap属于STF框架的一个工具,可以高速截图.同步手机屏幕至浏览器等   为什么用minicap截图: 经过试验,截同一个屏幕的一张图,adb shell screencap速度为2.9秒,而 ...

  6. 【Unity Shader】---基础光照

    一.[标准光照模型]1.自发光emissve:描述一个表面本身会发散多少光.在没有使用全局光照时,这些自发光是不会真正照亮周围物体. 自发光就是直接由发光体发射进入摄像机,不经过任何反射,在标准光照模 ...

  7. layui的分页使用(前端分页)

    <div id="one"></div>//显示数据库中数据的<ul id="ones"></ul>//显示分页 ...

  8. The Log-Structured Merge-Tree(译)

    coming from http://duanple.blog.163.com/blog/static/7097176720120391321283/

  9. sql下的xml配置文件中特殊使用的sql语句编写

    1.使用服用的sql语句------------查询学生表所有字段 <sql id="selectAllStuAll"> select stu.id,stu.name, ...

  10. 简历内容-resume

    1.TCP.UDP通信  服务器客户端  网络层 2.http协议 通信  网络编程  应用层  根据公司给出的应用层协议开发指定程序: 3.json  cjson Cjson解析器 4.freeRT ...