poj 3067

题意:日本东海岸有n个城市,西海岸有m个城市,现在要修建k条高铁连接东海岸的城市u和西海岸的城市v。问这k条高铁总共有多少个交点。

代码:

#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

vector<long long> a[1001];
long long n,m;
long long b[1001];

long long lowbit(long long x){
	return x&(-x);
}

void add(long long s,long long t){
	while(s<=m)
	{
		b[s]+=t;
		s+=lowbit(s);
	}
}

long long getsum(long long s){
	long long k=0;
	while(s>0)
	{
		k+=b[s];
		s-=lowbit(s);
	}
	return k;
}


void read(){
//	ifstream cin("in.txt");
	long long i,j,k,s,t;
	long long  cas;
	scanf("%lld",&cas);
	for(k=1;k<=cas;k++)
	{
		scanf("%lld%lld%lld",&n,&m,&s);
		memset(b,0,sizeof(b));
		for(i=1;i<=n;i++)
			a[i].clear();
		for(i=1;i<=s;i++)
		{
			scanf("%lld%lld",&j,&t);
			a[j].push_back(t);
			add(t,1);
		}
		long long ans=0;
		for(i=1;i<n;i++)
		{
			for(j=0;j<a[i].size();j++)
				add(a[i][j],-1);
			for(j=0;j<a[i].size();j++)
				ans+=getsum(a[i][j]-1);
		}
		printf("Test case %lld: %lld\n",k,ans);


	}
}

int main(){
	read();
	return 0;
}

posted on 2011-05-13 17:26  宇宙吾心  阅读(272)  评论(0)    收藏  举报

导航