您的位置:首页 > 其它

zoj 3129 || poj 3067 Japan

2011-03-17 22:50 381 查看
继续树状数组。



这题跟上一道差不多,对第二个数排序,按从大到小,相同的话按第一个数从大到小排序,因为只要有一个相同,就不能这么计算,所以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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: