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

来源:互联网 发布:linux下启动tomcat命令 编辑:程序博客网 时间:2024/05/16 00:55

传送门

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.
0 0