原题链接: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. 测开之路八十八:HTML之文本格式化

    准备一段文本内容 强调显示: <!-- b标签,加粗显示 --> <p><b>这是b标签的效果</b></p> <!-- strong ...

  2. 2017埙箫简谱清单分享(附音频Demo)

    前言 习箫五载,略有所获,皆在坚持. 本博文记录旨在记录练习过程中所录制的Demo以供自省.自娱.自乐,同时记录.分享简谱与箫友(目前为简谱,日后学会线谱后会添加相应谱子分类). 简谱 &&a ...

  3. Angular5 import interface 报错:XXX is not a module

    在项目里定义了一个interface,device.ts.然后在component.ts中要使用这个interface,import之后,VSCode报错:‘xxx/xxx/xxx/device.ts ...

  4. postman从body,headers,data中获取token后回写做全局变量

    设置全局变量

  5. Path.GetExtension 方法 (String)

    返回指定的路径字符串的扩展名. 命名空间:   System.IO程序集:  mscorlib(位于 mscorlib.dll) ----------------------------------- ...

  6. Java学习day8面向对象编程2-类的属性和方法

    一.类的属性 1.语法格式 修饰符 类型 属性名 = 初值 说明:修饰符private:该属性只能由该类的方法使用.在同一类内可见.使用对象:变量.方法. 注意:不能修饰类(外部类)    修饰符pu ...

  7. dfs(魔力转圈圈)

    http://oj.jxust.edu.cn/contest/problem?id=1563&pid=4 题目描述 Storm有一个m行n列的整数矩阵. 他会从(1,1)开始,顺时针螺旋访问该 ...

  8. 打乱一个排好序的 list 对象 alist?

    1. import random 2. random.shuffle(alist)

  9. github提交用户权限被拒

    场景介绍: 之前登陆了朋友的github账号,保存了朋友的GitHub信息在本地.今天想重新提交一个项目到自己的GitHub账号时,一直用朋友的账号提交且提示权限被拒. 解决: 方法一,GitHub配 ...

  10. 第一个javascript脚本

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...