您的位置:首页 > 其它

【树状数组】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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: