[Vijos P1842] Noip2013Day1T2

来源:互联网 发布:snmp监控返回端口号 编辑:程序博客网 时间:2024/04/28 11:40

嗯刚A了它~

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

Code:

const maxm=99999997;type pppp=recordnum,old:longint;  end;vara,b:array[0..1000000] of pppp;hash,step:array[0..1000000] of longint;i,j,k,n,ans:longint;t:pppp;procedure init;beginreadln(n);for i:=1 to n dobeginread(a[i].num);a[i].old:=i;end;for i:=1 to n dobeginread(b[i].num);b[i].old:=i;end;end;procedure qsort(l,r:longint);var i,j,mid:longint;begini:=l;j:=r;mid:=a[(i+j) div 2].num;repeatwhile (a[i].num<mid) do inc(i);while (a[j].num>mid) do dec(j);if i<=j then begint:=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;begini:=l;j:=r;mid:=b[(i+j) div 2].num;repeatwhile (b[i].num<mid) do inc(i);while (b[j].num>mid) do dec(j);if i<=j then begint:=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;beginif l>=r then exit;mid:=(l+r) shr 1;merge(l,mid);merge(mid+1,r);i:=l; j:=mid+1; k:=l;repeatif hash[i]>hash[j] then beginstep[k]:=hash[j];ans:=(ans+(mid-i+1)) mod maxm;inc(k);inc(j);end   else beginstep[k]:=hash[i];inc(k);inc(i);end;until ((i>mid) or (j>r));while (i<=mid) dobeginstep[k]:=hash[i];inc(i);inc(k);end;while (j<=r) dobeginstep[k]:=hash[j];inc(j);inc(k);end;for i:=l to r do hash[i]:=step[i];end;procedure main;begininit;qsort(1,n);qsort1(1,n);for i:=1 to n dohash[a[i].old]:=b[i].old;merge(1,n);writeln(ans);end;beginmain;end.


 

0 0
原创粉丝点击