ZOJ 3129 || POJ 3067 Japan

同POJ 2299 也是利用树状数组求逆序数的应用

将x从大到小排序,若x相同,按y从大到小排序,对y建立树状数组,根据逆序数的定义,画图演算一遍就很清楚了

#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define MAXN 1001
struct Pair{
int x, y;
}p[
1000010];
int n, m, k;
int c[MAXN];

int cmp(const void *a, const void *b){
if(((Pair*)a)->x == ((Pair*)b)->x)
return ((Pair*)b)->y - ((Pair*)a)->y;
return ((Pair*)b)->x - ((Pair*)a)->x;
}
inline
int lowbit(int t){
return t & (-t);
}
void update(int i){
while(i <= m){
c[i]
+= 1; //增量为1
i += lowbit(i);
}
}
int getsum(int i){
int sum = 0;
while(i > 0){
sum
+= c[i];
i
-= lowbit(i);
}
return sum;
}
int main(){
int T, t = 0;
scanf(
"%d", &T);
while( T-- ){
scanf(
"%d%d%d",&n, &m, &k);
for(int i = 1; i <= k; ++i){
scanf(
"%d%d",&p[i].x, &p[i].y);
}
qsort(p
+ 1, k, sizeof(p[0]), cmp);
long long ans = 0;
for(int i = 1; i <= k; ++i){
ans
+= getsum(p[i].y - 1);
update(p[i].y);
}
printf(
"Test case %d: %lld\n",++t, ans);
memset(c,
0, sizeof(c));
}
return 0;
}

posted @ 2011-04-17 14:48  L..  阅读(249)  评论(0编辑  收藏  举报