zoj 3129 || poj 3067 Japan

继续树状数组。

 

这题跟上一道差不多,对第二个数排序,按从大到小,相同的话按第一个数从大到小排序,因为只要有一个相同,就不能这么计算,所以Getsum里的参数是x-1.。。直接算它前面的加和就好。我开始还判断了,不知道为啥一直WA,后来改成这种了。。

 

上一题不能这么做,上一题是两个都相等才不加,一个相等也加 = =。。。

 

zoj 这题才过30多人。。。poj 2000+ 这差距。。

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 1010 using namespace std; typedef struct ARR{ int x,y; }ARR; ARR a[MAX*MAX]; long long c[MAX]; bool cmp( ARR a ,ARR b ) { if( a.y == b.y ) return a.x > b.x; return a.y > b.y; } int Lowbit(int x) { return x & (-x); } void Updata(int x) { while( x < MAX ) { c[x]++; x += Lowbit(x); } } long long Getsum(int x) { long long sum = 0ll; while( x > 0 ) { sum += c[x]; x -= Lowbit(x); } return sum; } int main() { int ncases,ind = 1; int n,m,k,i; long long sum; scanf("%d",&ncases); while( ncases-- ) { memset(c,0,sizeof(c)); sum = 0ll; scanf("%d%d%d",&n,&m,&k); for(i=1; i<=k; i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a+1,a+1+k,cmp); long long ans; for(i=1; i<=k; i++) { ans = Getsum(a[i].x-1); sum += ans; Updata(a[i].x); } printf("Test case %d: %lld/n",ind++,sum); } return 0; }  

你可能感兴趣的:(c,struct)