Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

离散化+暴力 141ms 内牛满面……(附代码及算法)

Posted by xk_00948124 at 2010-07-02 11:37:20 on Problem 2528
/*
算法:离散化+暴力
	首先输入所有线段,将它的起点终点排序,得到离散化的点
	将离散化的点从头到尾走一遍,得到每条线段对应的离散点编号
	对每条线段,更新离散点的上的颜色
*/

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#define MAX 10020

struct poster{
	int start;
	int end;
}l[MAX];

int posters[MAX][2];

struct point{ //离散点
	int pos;
	int colour;  //对应的
}p[2*MAX];

int cmp(const void* a, const void* b){
	struct point*p = (struct point*)a;
	struct point*q = (struct point*)b;
	return p->pos - q->pos;
}

int n;
int colour[2*MAX]; //离散点的颜色
int used[MAX]; //出现过的海报颜色

int main(){
	int out;
	scanf("%d",&out);
	while(out--){
		memset(l,0,sizeof(l));
		memset(posters,0,sizeof(posters));
		memset(colour, -1, sizeof(colour));
		memset(used,0,sizeof(used));

		scanf("%d",&n);
		int i,counter=0;
		for(i=0; i<n; i++){
			scanf("%d%d",&posters[i][0],&posters[i][1]);
			p[counter].pos = posters[i][0];
			p[counter++].colour = -i;
			p[counter].pos = posters[i][1];
			p[counter++].colour = i;
		}
		//离散化
		qsort(p,counter,sizeof(point),cmp);
		int real_point=0;
		int last_pos = -1; //与所有点都不同
		for(i=0; i<counter; i++){
			if(last_pos != p[i].pos) real_point++, last_pos = p[i].pos;
			if(p[i].colour < 0 ) l[-p[i].colour].start = real_point-1; //离散点的编号
			else l[p[i].colour].end = real_point-1;
		}

		for(i=0; i<n; i++)
			for(int j=l[i].start; j<= l[i].end; j++)
				colour[j] = i;
		int ans=0;
		for(i=0; i<real_point; i++)
			if(!used[colour[i]]) ans++,used[colour[i]] = true;

			printf("%d\n",ans);

	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator