题目描述 https://www.luogu.org/problemnew/show/P1367
有许多蚂蚁在一根无限长的木棍上,每一只蚂蚁都有一个初始位置和初始朝向(任意两只蚂蚁的初始位置不同)。蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计)。现给出每只蚂蚁的初始位置和初始朝向,请你计算出它们在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
思路:第一步 考虑的蚂蚁的“穿过”思路,类似于独木桥,另外考虑到蚂蚁的相对 位置是不变的, 所有蚂蚁的最终位置可以确定
第二步 确定蚂蚁的方向,蚂蚁的方向应该是这个蚂蚁想兑换的那个蚂蚁的方向。
最后,按照输入的顺序处理。这个花了好久才对应起来。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>
#define N 100008
using namespace std;
typedef struct {
int intv;
int seq;
} Node1;
typedef struct {
int v;
int dir;
} Node2;
Node1 Seq[N];
Node2 Val[N];
bool mycmp1(Node2 a,Node2 b) {
return a.v<=b.v;
}
bool mycmp2(Node1 a,Node1 b) {
return a.intv<=b.intv;
}
bool mycmp3(Node1 a,Node1 b) {
return a.seq<=b.seq;
}
int main() {
int n,t;
cin>>n>>t;
int tempv,tempd;
for(int i=1; i<=n; i++) {
cin>>tempv>>tempd;
Seq[i].intv=tempv;
Seq[i].seq=i;
Val[i].v=tempv;
Val[i].dir=tempd;
}
for(int i=1; i<=n; i++) {
if(Val[i].dir>0)
Val[i].v+=t;
else Val[i].v-=t;
}
sort(Val+1,Val+n+1,mycmp1);
sort(Seq+1,Seq+n+1,mycmp2);
for(int i=1; i<=n; i++) {
Seq[i].intv=i;
}
sort(Seq+1,Seq+n+1,mycmp3);
for(int i=1; i<n; i++) {
if(Val[i].v==Val[i+1].v) {
Val[i].dir=0;
Val[i+1].dir=0;
}
}
for(int i=1; i<=n; i++) {
cout<<Val[Seq[i].intv].v<<" "<<Val[Seq[i].intv].dir<<endl;
}
}