[noip2013][codevs3286]火柴排队

今天不考试,不考试,啦啦啦~~

好的严肃,虽然不考试依旧要刷题,搞了一套noip2013玩玩

这道题是day1的第二题,考了树状数组,排序和逆序对,无压力(我不会告诉你第一次快排出错的= =)

代码

var
        a,b,d,h,e,f:array[0..1001000] of int64;
        tot,k,n:int64;
        i,j:longint;

procedure qt1(l,r:longint);
var i,j,m,p:longint;
begin
i:=l; j:=r;
m:=a[(l+r) div 2];
repeat
 while a[i]<m do inc(i);
 while a[j]>m do dec(j);
 if i<=j then
  begin
    p:=a[i]; a[i]:=a[j]; a[j]:=p;
    p:=d[i]; d[i]:=d[j]; d[j]:=p;
    inc(i); dec(j);
  end;
 until i>j;
if i<r then qt1(i,r);
if l<j then qt1(l,j);
end;

procedure qt2(l,r:longint);
var i,j,m,p:longint;
begin
i:=l; j:=r;
m:=b[(l+r) div 2];
repeat
 while b[i]<m do inc(i);
 while b[j]>m do dec(j);
 if i<=j then
  begin
    p:=b[i]; b[i]:=b[j]; b[j]:=p;
    p:=f[i]; f[i]:=f[j]; f[j]:=p;
    inc(i); dec(j);
  end;
 until i>j;
if i<r then qt2(i,r);
if l<j then qt2(l,j);
end;

function lowbit(x:longint):longint;
begin exit(x and -x); end;

procedure  add(x:longint);
begin
        while x<=k do
        begin
                inc(h[x]);
                inc(x,lowbit(x));
        end;
end;

function sum(x:longint):longint;
begin
        sum:=0;
        while x>0 do
        begin
                inc(sum,h[x]);
                dec(x,lowbit(x));
        end;
end;

begin
        readln(n);
        for i:=1 to n  do begin read(a[i]);  d[i]:=i; end;
        for i:=1 to n do begin read(b[i]); f[i]:=i;end;
        qt1(1,n);
        qt2(1,n);
        for i:=1 to n do
        e[d[i]]:=f[i];
        k:=0;
        for i:=1 to n do
        if k<e[i] then k:=e[i];
        for i:=1 to n do
        begin
        add(e[i]);
        tot:=tot-sum(e[i])+i;
        end;
        writeln(tot mod 99999997);
end.

   喜欢就收藏一下,vic私人qq:1064864324,加我一起讨论问题,一起进步^-^

posted @ 2015-09-18 16:56  ROLL-THE-FIRST  阅读(166)  评论(0)    收藏  举报