codeforces 848B - Rooter's Song(构造+几何)
原题链接: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(构造+几何)的更多相关文章
- codeforces 848B Rooter's Song 思维题
http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标 ...
- Codeforces 848B Rooter's Song(分类+模拟)
题目链接 Rooter's Song 题意 有n个舞者站在x轴上或y轴上,每个人有不同的出发时间.x轴上的舞者垂直x轴正方向移动,y轴上的舞者垂直y轴正方向移动. 当x轴的舞者和y轴的舞者相遇时,他 ...
- [CodeForces - 848B] Rooter's Song 思维 找规律
大致题意: 有一个W*H的长方形,有n个人,分别站在X轴或Y轴,并沿直线向对面走,第i个人在ti的时刻出发,如果第i个人与第j个人相撞了 那么则交换两个人的运动方向,直到走到长方形边界停止,问最后每个 ...
- codeforces 848B Rooter's Song
题目链接 正解:排序+模拟. 我们注意到两个点碰撞的必要条件,$pi+tj=pj+ti$,移项以后发现就是$pi-ti=pj-tj$,那么我们可以把$p-t$相同的点分为同一组. 然后我们还可以发现一 ...
- ACM: CodeForces 140A New Year Table-数学几何
CodeForces 140A New Year Table Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d ...
- 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 ...
- Codeforces 707C Pythagorean Triples(构造三条边都为整数的直角三角形)
题目链接:http://codeforces.com/contest/707/problem/C 题目大意:给你一条边,问你能否构造一个包含这条边的直角三角形且该直角三角形三条边都为整数,能则输出另外 ...
- Codeforces 1246D/1225F Tree Factory (构造)
题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...
- Codeforces - 1202D - Print a 1337-string... - 构造
https://codeforces.com/contest/1202/problem/D 当时想的构造是中间两个3,然后前后的1和7组合出n,问题就是n假如是有一个比较大的质数因子或者它本身就是质数 ...
随机推荐
- Delphi XE2 之 FireMonkey 入门(29) - 数据绑定: TBindingsList: 表达式的 Evaluate() 方法
Delphi XE2 之 FireMonkey 入门(29) - 数据绑定: TBindingsList: 表达式的 Evaluate() 方法 TBindingsList 中可能不止一个表达式, 通 ...
- C++ 命名管道示例
想做一个 Hook CreateFile 重定向到内存的功能,貌似可以假借命名管道实现这个功能.不熟悉命名管道,做了几个demo,如下: Server: // NamedPipeServer.cpp ...
- C#实体类生成Create Table SQL
using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespac ...
- [12期]Mysql案例分析
腾讯视频源:http://v.qq.com/vplus/0ef1d6371912bf6d083dce956f48556c 访问新闻版块,去掉?ID=X的参数以后报错 参数去掉,没有报错,显示正常,说明 ...
- mooc-IDEA 项目/文件之间跳转--002
二.IntelliJ IDEA -项目之间跳转 1.Next Project Window :跳转到下一个项目 [ ctrl+alt+) ] 2.Previous Project Window:跳转到 ...
- Node.js实战14:一个简单的TCP服务器。
本文,将会展示如何用Nodejs内置的net模块开发一个TCP服务器,同时模拟一个客户端,并实现客户端和服务端交互. net模块是nodejs内置的基础网络模块,通过使用net,可以创建一个简单的tc ...
- windows10配置Docker容器独立IP地址互相通信
Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 ...
- Greg and Array CodeForces 296C 差分数组
Greg and Array CodeForces 296C 差分数组 题意 是说有n个数,m种操作,这m种操作就是让一段区间内的数增加或则减少,然后有k种控制,这k种控制是说让m种操作中的一段区域内 ...
- Java JDK在Mac下的配置方法
Java JDK在Mac.Windows下的配置方法 Mac 第一步:下载JDK 官网下载地址 第二步:安装JDK 安装步骤很简单,一直点击下一步即可. 第三步:配置环境变量 打开terminal(终 ...
- 问题 B: 傻鸡抓大闸蟹
问题 B: 傻鸡抓大闸蟹 时间限制: 1 Sec 内存限制: 128 MB提交: 94 解决: 39[提交] [状态] [命题人:jsu_admin] 题目描述 背景又到了吃大闸蟹的季节,黄老师想 ...