传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1106
题目大意
给定一个长度为2n的序列,1~n各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数
题解
如果一对在另一对内部,那么先消掉它,所以我们用一个栈存,如果这个数在栈中,那么把他们内部的部分向前移即可
由于ans不超过1000000所以暴力即可
var
x,t:array[0..50005]of longint;
i,j,k:longint;
n,ans:longint;
procedure swap(var a,b:longint);
var c:longint;
begin
c:=a; a:=b; b:=c;
end;
begin
readln(n); ans:=0;
fillchar(x,sizeof(x),0); t[0]:=0;
for i:=1 to 2*n do
begin
inc(t[0]); readln(t[t[0]]);
if x[t[t[0]]]=0
then x[t[t[0]]]:=1
else begin
for j:=t[0]-1 downto 1 do
if t[j]=t[t[0]] then break;
inc(ans,t[0]-j-1);
for k:=j to t[0]-1 do
t[k]:=t[k+1];
dec(t[0],2);
end;
end;
writeln(ans);
end.