Input
共两行,第一行一个整数 n,第二行 n 个值为 0 或 1 的整数,表示矩阵的最后一列。
Output
输出文件共一行,为矩阵的第一行。
Sample Input
5
1 1 0 0 0
Sample Output
0 0 1 0 1
Data Constraint
对于 20%的测试数据n ≤ 20
对于 50%的测试数据 n≤ 1000
对于 100%的测试数据n ≤ 10000
Hint
分析:我们知道最后一列的数字,其实就是知道了一级密码的1和0的个数(这点应该知道吧)。显然每个数字在第一列也出现了一遍,因为是有序的,那就说明第一列其实钱x个是0,后n-x个是1(x为0的个数)。
接下来就有点神奇了:
对于每个第一列和最后一列,可以这样写成两列(样例):
0 1
0 1
0 0
1 0
1 0
显然,我们把0和1连线,就是第一列第一个0连接第二列第1个0,第一列第二个0连接第二列第二个0…………(以此类推,从上往下数,1同理)。
那答案是什么呢,我们先从第一列第一个数开始输出0,到了第三行(因为是第一列第一个数连接第二列第三个数),对应第一列的数字是0,再到第五行,对应第一列数字是1,到了第二行,对应数字是0,再到第四行,对应数字是1,显然,答案就是0 0 1 0 1
(至于为什么,我也不清楚,要听大神说了)
代码:
var
n,i,x,y,s,r,t:longint;
a,f:array [1..10001] of longint;
begin
readln(n);
for i:=1 to n do
begin
read(a[i]);
if a[i]=0 then inc(x)
else inc(y);
end;
s:=1; t:=x+1;
for i:=1 to n do
begin
if a[i]=0 then begin f[s]:=i; inc(s); end
else begin f[t]:=i; inc(t); end;
end;
r:=1;
for i:=1 to n do
begin
write(a[f[r]],' ');
r:=f[r];
end;
end.