⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poj 2352 stars 树状数组.txt

📁 ACM资料大集合
💻 TXT
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;

//POJ 2352 Stars 树状数组
#define NMAX 32110
typedef struct point
{
	int x;
	int y;
}point;

int c[NMAX];
point star[NMAX];
int level[NMAX];
int ans[NMAX];

int getlow(int k)
{
	return k & (k ^ (k-1));
}

void add(int s,int num)
{	//往c[star[i].y]以及以后的c[]加点(加1个点)
	while(s<=NMAX)
	{
		c[s]++;
		s+=getlow(s);
	}
}

int getsum(int s)
{	//统计y=1,2....start[i].y有几个点
	int sum=0;
	while(s>=1)
	{
		sum+=c[s];
		s-=getlow(s);
	}
	return sum;
}

int cmpx(const void *a,const void *b)
{
	if((*(point *)a).x-((*(point *)b).x)==0) return (*(point *)a).y-(*(point *)b).y;
	else return  (*(point *)a).x-(*(point *)b).x;
}

void print(int num)
{
	int i;
	for(i=1;i<=num;i++)
	{
		printf("%d %d\n",star[i].x,star[i].y);
	}
}

void solve(int num)
{
	int i;
	qsort(star+1,num,sizeof(point),cmpx);
	for(i=1;i<=num;i++) 
	{
		ans[i]=level[i]=c[i]=0;
		star[i].y++;
		star[i].x++;
	}
	for(i=1;i<=num;i++)
	{
		level[i]=getsum(star[i].y);
		add(star[i].y,num);
	}
	for(i=1;i<=num;i++)	ans[level[i]]++;
}

int main()
{
	int i,num;
	while(scanf("%d",&num)!=EOF)
	{
		for(i=1;i<=num;i++)
		{
			scanf("%d %d",&star[i].x,&star[i].y);
		}
		solve(num);
		for(i=0;i<=num-1;i++)
			printf("%d\n",ans[i]);
	}
//	system("pause");
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -