Japan

原创 2016年08月30日 13:24:27
链接:http://poj.org/problem?id=3067

题目:Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coast and M cities on the West coast (M <= 1000, N <= 1000). K superhighways will be build. Cities on each coast are numbered 1, 2, ... from North to South. Each superhighway is straight line and connects city on the East coast with city of the West coast. The funding for the construction is guaranteed by ACM. A major portion of the sum is determined by the number of crossings between superhighways. At most two superhighways cross at one location. Write a program that calculates the number of the crossings between superhighways.

题意:给两列数字,均为从上到下为1到n,再给它们之间的连线,求交点一共多少个(两两相交算一个)

分析:这道题利用的是计算的规律,题目里说到所给的数据是从小到大给的,但是我还是排了一下序,左列优先,右列次之,之后从最小的开始把右列的值放入树状数组,因为左列优先,所以之后的点对,只有在树状数组里存在别右列的值小的点才会有焦点,而且有几个就有几个焦点。

题解:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <functional>
#include <cmath>
#include <cctype>
#include <cfloat>
#include <climits>
#include <complex>
#include <deque>
#include <list>
#include <set>
#include <utility>
using namespace std;

__int64 ans;
int num[1000010];
int bit[1000010];
pair<int,int> ps[1000010];
int N,M,K;

void add(int x)
{
	while(x<=1000001){
		bit[x]+=1;
		x+=x&-x;
	}
}

__int64 countn(int x)
{
	__int64 an=0;
	while(x){
		an+=bit[x];
		x-=x&-x;
	}
	return an;
}

bool cmp(pair<int,int> a,pair<int,int> b)
{
	if(a.first==b.first) return a.second<b.second;
	else return a.first<b.first;
}

int main()
{
	//freopen("in.txt","r",stdin);
	int n;
	scanf("%d",&n);
	for(int T=1;T<=n;T++)
	{
		memset(bit,0,sizeof bit);
		ans=0;
		scanf("%d %d %d",&N,&M,&K);
		for(int i=1;i<=K;i++){
			scanf("%d %d",&ps[i].first,&ps[i].second);
		}
		sort(ps+1,ps+K+1,cmp);
		for(int i=1;i<=K;i++){
			ans+=countn(1000001)-countn(ps[i].second);
			add(ps[i].second);
		}
		printf("Test case %d: %lld\n",T,ans);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

acm比赛题目(2006japan.f)

  • 2012年11月12日 14:32
  • 676KB
  • 下载

japan演员花名册档案

  • 2008年12月29日 21:48
  • 6.63MB
  • 下载

POJ3067:Japan(树状数组求逆序对)

Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for...

japan module for grub

  • 2013年02月12日 10:50
  • 20KB
  • 下载

日语壁纸桌面,japan

  • 2009年05月11日 10:15
  • 216KB
  • 下载

Japan POJ - 3067 (树状数组+升序降序)

Japan  POJ - 3067
  • lwgkzl
  • lwgkzl
  • 2016年12月19日 19:46
  • 109

ATC 文件加密压缩工具(Japan)

  • 2009年11月26日 13:53
  • 2.11MB
  • 下载

Age of Japan 2

  • 2008年08月30日 18:58
  • 9.76MB
  • 下载

POJ 3067 Japan 树状数组

题目链接:POJ 3067 Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27551   Acc...

japan50v3.3b071018.exe

  • 2008年01月06日 21:18
  • 9.03MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Japan
举报原因:
原因补充:

(最多只允许输入30个字)