题目描述
有许多蚂蚁在一根无限长的木棍上,每一只蚂蚁都有一个初始位置和初始朝向(任意两只蚂蚁的初始位置不同)。蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计)。现给出每只蚂蚁的初始位置和初始朝向,请你计算出它们在t秒后的位置和朝向。
输入格式
第一行,两个空格隔开的整数n,t(代表蚂蚁数n和时间t)
第2~n+1行每行两个整数,第i+1行代表第i只蚂蚁的初始位置ai(ai的绝对值在1000000以内)及初始朝向bi(bi=1时蚂蚁朝右,bi=-1时蚂蚁朝左)
输出格式
n行,每行两个整数,第i行代表t秒后第i只蚂蚁的位置及朝向(-1表示朝左,1表示朝右,0表示正在转向中)
输入输出样例
输入 #1复制
4 1 1 1 5 1 3 -1 10 1输出 #1复制
2 0 6 1 2 0 11 1说明/提示
【数据范围】
对于40%的数据,n<=100
对于80%的数据,n<=10000,t<=1000
对于100%的数据,n<=100000,t<=100000
目标:获得t秒后,蚂蚁们的位置分布;
题目类型:模拟
注意点: 1)样例的蚂蚁坐标是乱序的,需要按坐标排序。
2)最终输出的结果要按最初给的顺序输出, 即按初始下标(样例提供顺序)排序。
3)转向时间不计, 在1s内,无论如何都会产生1的位移;
4)两只蚂蚁相撞,互换方向,并前进 可以视为 两只蚂蚁继续往前,只交换初始下标即可。
5)当且仅当, 两只蚂蚁在同一点时,视为正在转向,即toward 0 状态。
代码:
6)数据偏大,不要1s、1s地模拟,直接到ts后的状态即可。
#include <bits/stdc++.h>
#define MAXN 1e6+2
#define inf 0x3f3f3f3f
#define rep(x, a, b) for(int x=a; x<=b; x++)
using namespace std;
const int NC = 1e5+2;
struct node{
int toward;
int pos;
int index;
}po[NC];
int t, n;
int position[NC];
void swap_(int a, int b)
{
int t1, t2, t3;
t1 = po[a].index;
t2 = po[a].pos;
t3 = po[a].toward;
po[a].index = po[b].index;
po[a].pos = po[b].pos;
po[a].toward = po[b].toward;
po[b].index = t1;
po[b].pos = t2;
po[b].toward = t3;
}
void sort_()
{
rep(i, 1, n)
rep(j, i+1, n)
if(po[i].pos > po[j].pos) swap_(i, j);
}
int main()
{
cin>>n>>t;
rep(i, 1, n)
{
po[i].index = i;
cin>>po[i].pos>>po[i].toward;
}
sort_();
rep(i, 1, n)
{
po[i].pos += po[i].toward*t;
position[po[i].index] = i;//记录 以初始下标为自变量 的蚂蚁 在排序后 的 顺序
}
sort_();
rep(i, 1, n-1)
{
if(po[i].pos == po[i+1].pos)//同一点的蚂蚁视为转向ing
{
po[i].toward = 0;
po[i+1].toward = 0;
}
}
rep(i, 1, n)//用用初始下标的顺序查询 当前该蚂蚁所排的位置,再调用并输出。
cout<<po[position[i]].pos<<" "<<po[position[i]].toward<<endl;
return 0;
}