P6607蚂蚁 模拟 题解
Math_rad_round
·
·
题解
P6607
题意简述
一条长为L的线上有N个点。每个点都以每秒移动一个单位的速度向前,
当迎面碰到另一个点时,立即掉头并继续向前。确定每个点离开绳子所用时间。
------
这种“ _相遇掉头并继续向前_ ”问题,你可以假装你拿着望远镜在远处看
当你看到两个点相遇时,因为你区分不出每一个点,所以你只是会以为两个点 _穿_ 了过去
例如原本有两个点$\ \ \ \ \ \ \ \ \ \ \ \ $ $A(3)$右,$B(4)$左
相遇时过了$0.5$秒,此时$\ \ $ $A(3.5)$右,$B(3.5)$左
掉头,$\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ $ 此时$\ \ $ $A(3.5)$左,$B(3.5)$右
再过$0.5$秒,$\ \ \ \ \ \ \ \ $此时$\ \ $ $A(3)$左,$B(4)$右
如果把$A,B$反转,$ $ 就是$\ \ $ $B(3)$左,$A(4)$右
而如果直接穿过——$\ \ \ \ \ \ \ \ \ \ $ $B(3)$左,$A(4)$右
所以如果有$A(3)$右,那$10$秒后一定有一个点$(13)$右
同时,因为不可能互相穿过,所以每个点的顺序一定不会改
比如$A$一开始在$B$左边紧邻,那$A$永远都在$B$左边紧邻
所以我们只要处理出
左边有点到达的时间,从小到大配对给左边的若干个点,
右边有点到达的时间,从大到小配对给接下来的点,
------------
AC代码:
```cpp
#include<iostream>
using namespace std;
int a[100001];
int b[100001];
int c[100001];
int main(){
int n,l;
cin>>n>>l;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
int h=0;
for(int i=1;i<=n;i++){
if(b[i]==0){//左边到达
cout<<a[i]<<" ";
}
}
for(int i=1;i<=n;i++){
if(b[i]==1){//右边到达
cout<<l-a[i]<<" ";
}
}
}
```
------------
谢谢观赏!