NOIP2013提高组复赛 火柴排队 解题报告
来源:互联网 发布:java ssh 教程 编辑:程序博客网 时间:2024/06/05 06:56
const
c=99999997;
var
mid,key,a,b:array[1..100000]of longint;
u:array[1..100000]of longint;
n,m,i,j,k:longint;ans:int64;
procedure sort1(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do
inc(i);
while x<a[j] do
dec(j);
if not(i>j) then
begin
y:=a[i];
a[i]:=a[j];
a[j]:=y;
y:=mid[i];
mid[i]:=mid[j];
mid[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort1(l,j);
if i<r then
sort1(i,r);
end;
procedure sort2(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=b[(l+r) div 2];
repeat
while b[i]<x do
inc(i);
while x<b[j] do
dec(j);
if not(i>j) then
begin
y:=b[i];
b[i]:=b[j];
b[j]:=y;
y:=mid[i];
mid[i]:=mid[j];
mid[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort2(l,j);
if i<r then
sort2(i,r);
end;
procedure merge(i,j:longint);
var
k,p1,p2,l:longint;
begin
if i>=j then exit;
l:=(i+j)div 2;
merge(i,l);merge(l+1,j);
p1:=i;p2:=l+1;
for k:=i to j do
if ((p1<=l)and(a[p1]<a[p2]))or(p2>j) then
begin
u[k]:=a[p1];
inc(p1);
end
else
begin
u[k]:=a[p2];
ans:=(ans+l-p1+1) mod c;
inc(p2);
end;
for k:=i to j do a[k]:=u[k];
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
readln;
for j:=1 to n do read(b[j]);
//读入,不解释
for i:=1 to n do mid[i]:=i;
sort1(1,n);
for i:=1 to n do a[mid[i]]:=i;
//把a离散化成1..n的形式
for i:=1 to n do mid[i]:=i;
sort2(1,n);
for i:=1 to n do b[mid[i]]:=i;
//把b离散化成1..n的形式
for i:=1 to n do key[b[i]]:=i;
for i:=1 to n do a[i]:=key[a[i]];
//a置为a中元素的目的地
ans:=0;
merge(1,n);
//归并秒杀
writeln(ans mod c);
end.
代码:
var
t,n,i,j:longint;
ans:int64;
a:array[1..200000,1..4]of longint;
procedure mergot(l,x,r:longint);
var
b:array[1..200000]of longint;
i,j,p:longint;
begin
i:=l;j:=x+1;p:=l;
while p<=r do begin
if (i<=x)and((j>r)or(a[i,4]<=a[j,4]))then begin
b[p]:=a[i,4];inc(i);end else begin
b[p]:=a[j,4];inc(j);ans:=ans+x-i+1;end;inc(p);end;
for i:=l to r do a[i,4]:=b[i];
end;
procedure msort(l,r:longint);
begin
if l>=r then exit;
msort(l,(l+r)shr 1);
msort((l+r)shr 1+1,r);
mergot(l,(l+r)shr 1,r);
end;
procedure swap(var x,y:longint);
var t:longint;
begin
t:=x;x:=y;y:=t;
end;
procedure qsort(l,r,x,y:longint);
var
i,j,mid,t:longint;
begin
i:=l;j:=r;mid:=a[(l+r)shr 1,x];
repeat
while a[i,x]<mid do inc(i); while a[j,x]>mid do dec(j);
if i<=j then begin swap(a[i,x],a[j,x]);
swap(a[i,x+1+y],a[j,x+1+y]);inc(i);dec(j);end;
until i>j;
if i<r then qsort(i,r,x,y);
if l<j then qsort(l,j,x,y);
end;
begin
read(n);
for i:=1 to n do begin read(a[i,1]);a[i,2]:=i;end;
for i:=1 to n do begin read(a[i,3]);a[i,4]:=i;end;
qsort(1,n,1,0);qsort(1,n,3,0);qsort(1,n,2,1);
ans:=0;
msort(1,n);
writeln(ans mod 99999997);
end.
- NOIP2013提高组复赛 火柴排队 解题报告
- NOIP2013 提高组复赛解题报告
- 【NOIP2013提高组】火柴排队
- 【NOIP2013提高组】火柴排队
- P1092 - 【NOIP2013】火柴排队 解题报告
- NOIP2013提高组 火柴排队(重庆一中高2018级信息学竞赛测验6) 解题报告
- NOIP2013复赛提高组day1(A:转圈游戏 B:火柴排队 C:货车运输)
- NOIP2013提高组复赛 转圈游戏 解题报告
- 【NOIP2013提高组day1】火柴排队
- 【NOIP2013提高组】火柴排队-逆序对
- NOIP2013 火柴排队 解题报告(贪心+逆序对)
- NOIP2013提高组 B.火柴排队 (逆序对)
- NOIP2013提高组 火柴排队 (逆序对+特殊映射)
- NOIP2013提高组 火柴排队 (分治逆序对)
- 【noip2013提高组】火柴排队 树状数组+逆序对
- 【扩散】【福利】NOIp2013提高组解题报告
- 【NOIP2013】【提高组】【Day1】【解题报告】
- 【noip2013】【提高组】【Day2】【解题报告】
- 25-GUI-04-GUI(ActionListener演示)
- Error: Package: krb5-workstation-1.10.3-10.el6_4.6.x86_64 (@anaconda-CentOS-201311272149.x86_64/6.5)
- 转载-二分查找(附感悟)
- iOS入门(二十九)Target Action 和手势
- Microsoft Visual Studio 2010 的远程调试器
- NOIP2013提高组复赛 火柴排队 解题报告
- 25-GUI-05-GUI(鼠标事件)
- 1004 let the balloon rise
- BZOJ1016
- 如何批量删除指定文件或以什么结尾的文件
- 关于环信即时通信的使用小结
- C++Builder6程序设计教程,用TADOConnection,TADOQuery,TADOTable,TDataSource,TDBGrid相关控件实现对数据库的操作
- 【leetcode】Recover Binary Search Tree
- 数字证书原理