原题链接: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. Socket 网络编程实践经验

    目录 目录 相关文章 Socket 与 HTTP 的区别 生产实践考虑 网络断开重连问题 Heartbeat 心跳机制 使用非阻塞模式下的 select 函数进行 Socket 连接检查 会话过期问题 ...

  2. pgd 游戏教程 基地

    http://www.pascalgamedevelopment.com/content.php?417-Castle-Game-Engine-6-2-released

  3. 将字符串映射为Delphi控件名,批量修改控件属性

    http://blog.sina.com.cn/s/blog_4dfbd07c01000a81.html 将字符串映射为Delphi控件名,批量修改控件属性 (2007-10-08 14:50:51) ...

  4. 使用pyautogui替代selenium,图像识别进行web自动化测试--基于python语言

    这里演示一下使用pyautogui替代selenium进行web自动化测试,并不建议使用pyautogui进行web自动化测试,因为元素的ui一旦有长宽变化,或者风格的变化,执行时就会发生异常,仅当学 ...

  5. 000 (H5*) 常见代码

    目录: 1:HTML 1:块级元素(block-level) 2:行内元素(inline-level) 3:行内块元素(inline-block) 4: img标签 5:表单元素 6:自定义列表  d ...

  6. ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.

    在做多表映射查询时,在同一个resultMap中写了1:1映射和1:n映射,结果测试时报错如下: org.apache.ibatis.exceptions.PersistenceException: ...

  7. Linux-SSH免密登陆原理

  8. 深入ArrayList看fast-fail机制

    fail-fast机制简介 什么是fail-fast fail-fast 机制是java集合(Collection)中的一种错误机制.它只能被用来检测错误,因为JDK并不保证fail-fast机制一定 ...

  9. SpringBootTest单元测试及日志

    springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich. 由于是一系列文章,所以后面的文章可能会使用到前面文章的项 ...

  10. 垃圾回收器及tomcat调优

    垃圾回收机制 1.概述:垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域".垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存 ...