[BZOJ1106] [POI2007]立方体大作战tet

传送门

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.

你可能感兴趣的:([BZOJ1106] [POI2007]立方体大作战tet)