Description
Alice上化学课时又分心了,他首先画了一个3行N列的表格,然后把数字1到N填入表格的第一行,保证每个数只出现一次,另外两行他也填入数字1到N,但不限制每个数字的出现次数。
Alice现在想删除若干列使得每一行排完序后完全一样,编程计算最少需要删除多少列。
Input
第一行包含一个整数N(1<=N<=100000),表示表格的列数。
接下来三行每行包含N个整数,每个数在1到N之间,而且第一行的数互不相同。
Output
输出最少需要删除的列数。
Hint
【数据范围】
40%的数据N<=100
70%的数据N<=10000
分析
就是一个暴力,考试时想到了和正解类似的方法,但嫌麻烦,没有打。
这个正解的暴力很优美,非常玄学。
具体见程序,自行体会。
代码
var
a,b:array[1..3,0..100010] of longint;
c:array[1..3,0..100010] of longint;
n:longint;
ans:longint;
i,j,k:longint;
t:boolean;
begin
readln(n);
for i:=1 to n do
begin
read(j);
a[1,j]:=a[1,j]+1;
b[1,i]:=j;
end;
readln;
for i:=1 to n do
begin
read(j);
a[2,j]:=a[2,j]+1;
b[2,i]:=j;
end;
readln;
for i:=1 to n do
begin
read(j);
a[3,j]:=a[3,j]+1;
b[3,i]:=j;
end;
ans:=0;
t:=true;
while t do
begin
t:=false;
for i:=1 to n do
begin
if b[1,i]=0
then continue;
if (a[2,b[1,i]]=0) or (a[3,b[1,i]]=0)
then
begin
t:=true;
ans:=ans+1;
b[1,i]:=0;
dec(a[2,b[2,i]]);
dec(a[3,b[3,i]]);
if a[2,b[2,i]]<0 then a[2,b[2,i]]:=0;
if a[3,b[3,i]]<0 then a[3,b[3,i]]:=0;
end;
end;
end;
write(ans);
end.