您的位置:首页 > 其它

[Vijos P1842] Noip2013Day1T2

2014-09-02 13:07 134 查看
嗯刚A了它~

就是先排个序,然后搞他们应该在哪个位置上,然后求逆序对

Code:

const maxm=99999997;
type pppp=record
			num,old:longint;
		  end;
var	a,b:array[0..1000000] of pppp;
	hash,step:array[0..1000000] of longint;
	i,j,k,n,ans:longint;
	t:pppp;
procedure init;
begin
	readln(n);
	for i:=1 to n do
	begin
		read(a[i].num);
		a[i].old:=i;
	end;
	for i:=1 to n do
	begin
		read(b[i].num);
		b[i].old:=i;
	end;
end;
procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
	i:=l;j:=r;mid:=a[(i+j) div 2].num;
	repeat
		while (a[i].num<mid) do inc(i);
		while (a[j].num>mid) do dec(j);
		if i<=j then begin
						t:=a[i];
						a[i]:=a[j];
						a[j]:=t;
						inc(i); dec(j);
					 end;
	until i>j;
	if j>l then qsort(l,j);
	if i<r then qsort(i,r);
end;
procedure qsort1(l,r:longint);
var i,j,mid:longint;
begin
	i:=l;j:=r;mid:=b[(i+j) div 2].num;
	repeat
		while (b[i].num<mid) do inc(i);
		while (b[j].num>mid) do dec(j);
		if i<=j then begin
						t:=b[i];
						b[i]:=b[j];
						b[j]:=t;
						inc(i); dec(j);
					 end;
	until i>j;
	if j>l then qsort1(l,j);
	if i<r then qsort1(i,r);
end;
procedure merge(l,r:longint);
var i,j,k,mid:longint;
begin
	if l>=r then exit;
	mid:=(l+r) shr 1;
	merge(l,mid);
	merge(mid+1,r);
	i:=l; j:=mid+1; k:=l;
	repeat
		if hash[i]>hash[j] then begin
									step[k]:=hash[j];
									ans:=(ans+(mid-i+1)) mod maxm;
									inc(k);
									inc(j);
								end
						   else begin
									step[k]:=hash[i];
									inc(k);
									inc(i);
								end;
	until ((i>mid) or (j>r));
	while (i<=mid) do
	begin
		step[k]:=hash[i];
		inc(i);
		inc(k);
	end;
	while (j<=r) do
	begin
		step[k]:=hash[j];
		inc(j);
		inc(k);
	end;
	for i:=l to r do hash[i]:=step[i];
end;
procedure main;
begin
	init;
	qsort(1,n);
	qsort1(1,n);
	for i:=1 to n do
		hash[a[i].old]:=b[i].old;
	merge(1,n);
	writeln(ans);
end;
begin
	main;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: