在东西排布的两棵树之间悬挂着一条长为 L L L 的细绳,有 N N N 只蚂蚁在这条绳上。这些蚂蚁希望通过绳子爬到任何一棵树上,但这条绳太细了,导致两只蚂蚁不能并排爬行,也不能交错而过。
它们想到了一个方法:每只蚂蚁都以每单位时间移动一个单位距离的速度不断向前爬,当迎面碰到另一只蚂蚁时,两只蚂蚁都将立即掉头并继续向前爬。现在,蚂蚁们想知道自己是否能爬下绳子,如果能,它们还希望知道自己爬下绳子所花的时间。为了方便,我们按初始时位置从东到西的顺序对蚂蚁从 1 1 1 开始编号。
输入的第一行包含两个正整数
N
,
L
N, L
N,L,保证
N
≤
1
0
5
,
L
≤
1
0
9
N\le 10^5, L\le 10^9
N≤105,L≤109,且
N
<
L
N
输入的第二行包含
N
N
N 个正整数,第
i
i
i 个数
p
i
p_i
pi 表示第
i
i
i 只蚂蚁到东侧树木的距离,保证
p
i
p_i
pi 随
i
i
i 增大严格递增,且
0
<
p
i
<
L
0
输入的第三行包含 N N N 个整数,第 i i i 个数 d i d_i di 若为 1 1 1 则表示第 i i i 只蚂蚁一开始朝向西侧,为 0 0 0 则表示朝向东侧。
输出仅一行,包含 N N N 个数,第 i i i 个数表示第 i i i 只蚂蚁爬下绳子所花时间,四舍五入保留到整数。若第 i i i 只蚂蚁无法爬下绳子,则输出的第 i i i 个数为 − 1 -1 −1。
3 6
1 3 5
1 1 0
5 5 3
第三只蚂蚁在爬行 1 1 1 个单位时间后遇见第二只蚂蚁并掉头,再爬行 2 2 2 个单位时间到西侧树木;
第二只蚂蚁在爬行 1 1 1 个单位时间后遇见第三只蚂蚁并掉头,再爬行 1 1 1 个单位时间后遇见第一只蚂蚁并掉头,再爬行 3 3 3 个单位时间到西侧树木;
第一只蚂蚁在爬行 2 2 2 个单位时间后遇见第二只蚂蚁并掉头,再爬行 3 3 3 个单位时间到东侧树木。
子任务 1 1 1( 17 17 17 分)
子任务 2 2 2( 19 19 19 分)
子任务 3 3 3( 27 27 27 分)
子任务 4 4 4( 37 37 37 分)
#include
using namespace std;
int n,l;
int a[1000001],b[1000001];
int main()
{
cin>>n>>l;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
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]<<' ';
return 0;
}