【树状数组】Japan(POJ3067)PASCAL…
2015-02-02 19:24
387 查看
【树状数组】Japan(POJ3067)
Time Limit:1000MS Memory
Limit:65536KTotal Submit:18 Accepted:10
Description
【问题描述】 日本为了迎接ACM ICPC世界总决赛的到来,计划修建许多道路。日本是一个岛国,其东海岸有N座城市,西海岸有M座城市(M
<= 1000, N <=
1000)。K条高速公路将要修建。每个海岸上的城市都被编号为1,2,…从北向南编号。每条高速公路连接东海岸的一座城市和西海岸的一座城市。修建道路的资金由ACM提供保障。有些高速公路会产生交叉。同一个地点最多只会有两条高速公路交汇于此。请你写一个程序,计算高速公路之间的交叉点的数目。Input
输入文件首先包含数字T,表示测试数据的组数。每组测试数据以三个整数N, M, K
开头,接下来K行每行两个整数,表示高速公路两头的城市编号(第一个数是东海岸的城市编号,第二个数是西海岸的城市编号)。Output
对于每组测试数据,按如下格式输出一行: Test case (测试数据编号): (交叉点数目)Sample
Input
Sample
Output
Hint
请将你的程序在 http://poj.org/problem?id=3067 上提交测试是否能通过!Source
Southeastern Europe
2006 var t,n,m,k,jj:longint; s:int64; a:array[0..1000010,1..2]of longint; c:array[1..1010]of longint; mark:array[1..1010]of boolean;procedure qsort(l,r:longint);var i,j,k1,k2:longint;begin if l>=r then exit; i:=l; j:=r; k1:=a[(i+j) div 2,1]; k2:=a[(i+j) div 2,2]; while i<=j do begin while
(a[i,2]>k2)or((a[i,2]=k2)and(a[i,1]>k1))
do inc(i); while
(a[j,2]<k2)or((a[j,2]=k2)and(a[j,1]<k1))
do dec(j); if i<=j then begin a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0]; inc(i); dec(j); end; end; qsort(l,j); qsort(i,r);end;function find(i:longint):longint;begin find:=0; while i>0 do begin find:=find+c[i]; i:=i-i and -i; end;end;procedure add(i:longint);begin while i<=n do begin inc(c[i]); i:=i+i and -i; end;end;procedure main;var i,j,o:longint;begin qsort(1,k); for i:=1 to k do begin
o:=find(a[i,1]-1);
s:=s+o;
add(a[i,1]); end;end;procedure print;begin write('Test case '); write(jj); write(': '); write(s); writeln;end;procedure init;var i:longint;begin readln(t); for jj:=1 to t do begin s:=0; fillchar(a,sizeof(a),0); fillchar(c,sizeof(c),0); fillchar(mark,sizeof(mark),0); readln(n,m,k); for i:=1 to k do read(a[i,1],a[i,2]); main; print; end;end;begin init;end.
Time Limit:1000MS Memory
Limit:65536KTotal Submit:18 Accepted:10
Description
【问题描述】 日本为了迎接ACM ICPC世界总决赛的到来,计划修建许多道路。日本是一个岛国,其东海岸有N座城市,西海岸有M座城市(M
<= 1000, N <=
1000)。K条高速公路将要修建。每个海岸上的城市都被编号为1,2,…从北向南编号。每条高速公路连接东海岸的一座城市和西海岸的一座城市。修建道路的资金由ACM提供保障。有些高速公路会产生交叉。同一个地点最多只会有两条高速公路交汇于此。请你写一个程序,计算高速公路之间的交叉点的数目。Input
输入文件首先包含数字T,表示测试数据的组数。每组测试数据以三个整数N, M, K
开头,接下来K行每行两个整数,表示高速公路两头的城市编号(第一个数是东海岸的城市编号,第二个数是西海岸的城市编号)。Output
对于每组测试数据,按如下格式输出一行: Test case (测试数据编号): (交叉点数目)Sample
Input
Sample
Output
Hint
请将你的程序在 http://poj.org/problem?id=3067 上提交测试是否能通过!Source
Southeastern Europe
2006 var t,n,m,k,jj:longint; s:int64; a:array[0..1000010,1..2]of longint; c:array[1..1010]of longint; mark:array[1..1010]of boolean;procedure qsort(l,r:longint);var i,j,k1,k2:longint;begin if l>=r then exit; i:=l; j:=r; k1:=a[(i+j) div 2,1]; k2:=a[(i+j) div 2,2]; while i<=j do begin while
(a[i,2]>k2)or((a[i,2]=k2)and(a[i,1]>k1))
do inc(i); while
(a[j,2]<k2)or((a[j,2]=k2)and(a[j,1]<k1))
do dec(j); if i<=j then begin a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0]; inc(i); dec(j); end; end; qsort(l,j); qsort(i,r);end;function find(i:longint):longint;begin find:=0; while i>0 do begin find:=find+c[i]; i:=i-i and -i; end;end;procedure add(i:longint);begin while i<=n do begin inc(c[i]); i:=i+i and -i; end;end;procedure main;var i,j,o:longint;begin qsort(1,k); for i:=1 to k do begin
o:=find(a[i,1]-1);
s:=s+o;
add(a[i,1]); end;end;procedure print;begin write('Test case '); write(jj); write(': '); write(s); writeln;end;procedure init;var i:longint;begin readln(t); for jj:=1 to t do begin s:=0; fillchar(a,sizeof(a),0); fillchar(c,sizeof(c),0); fillchar(mark,sizeof(mark),0); readln(n,m,k); for i:=1 to k do read(a[i,1],a[i,2]); main; print; end;end;begin init;end.
相关文章推荐
- POJ3067:Japan(树状数组求逆序对)
- POJ3067 Japan(树状数组,逆序数)
- POJ3067:Japan(树状数组求逆序对)
- poj3067 Japan(树状数组)
- POJ3067 Japan(树状数组)
- POJ3067--Japan(树状数组)
- POJ3067 Japan【树状数组】【逆序数】
- POJ3067 Japan(树状数组)
- poj3067 Japan(树状数组)
- poj3067 Japan 树状数组求逆序对
- 【树状数组--求逆序数】poj3067 Japan
- poj3067 Japan (树状数组)
- poj3067(树状数组求逆序数)
- POJ 3067 Japan(经典树状数组)
- POJ3067 树状数组 情景转化为区间求和
- POJ 3067 Japan(树状数组求逆序数)
- poj 3067 Japan(树状数组)
- POJ 3067 Japan(树状数组)
- POJ3067(树状数组逆序对)
- POJ 3067 Japan (树状数组 + 逆序数)