码迷,mamicode.com
首页 > 其他好文 > 详细

FZU 2163 多米诺骨牌

时间:2014-05-15 20:30:47      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:des   blog   class   code   c   http   

bubuko.com,布布扣 Problem Description

Vasya很喜欢排多米诺骨牌。他已经厌倦了普通的多米诺骨牌,所以他用不同高度的多米诺骨牌。他从左边到右边,把n个多米诺骨牌沿一个轴放在桌子上。每一个多米诺骨牌垂直于该轴,使该轴穿过其底部的中心。第i个多米诺骨牌具有坐标xi与高度hi。现在Vasya想要知道,对于每一个多米诺骨牌如果他推倒的话,右侧会有多少个多米诺骨牌也会倒下。

想想看,一个多米诺倒下,如果它严格的触动右侧的多米诺骨牌,被触碰的也会倒下。换句话说,如果多米诺骨牌(初始坐标x和高度h)倒下,会导致所有在[ X + 1,x + H - 1]范围内的多米诺骨牌倒下。

bubuko.com,布布扣 Input

输入有多组测试数据,处理到文件结尾。

每组测试数据第一行包含整数n(1≤N≤10^5),这是多米诺骨牌的数量。然后n行,每行包含两个整数xi与hi(-10^8≤xi≤10^8 ,2 ≤hi≤108),xi表示多米诺骨牌的坐标和hi表示多米诺骨牌的高度。没有两个多米诺骨牌在同一个坐标点上。

bubuko.com,布布扣 Output

对于每组数据输出一行,包含n个空格分隔的数Zi - 表示倒下的多米诺骨牌数量,如果Vasya推第i个多米诺骨牌(包括多米诺骨牌本身)。

bubuko.com,布布扣 Sample Input

416 520 510 1018 236 72 9-6 10

bubuko.com,布布扣 Sample Output

3 1 4 11 2 3

思路:排序后,正着做超时了,所以就想到反着来,记忆一下

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 100005;

struct node{
	int x;
	int h;
	int cnt;
	int ans;
	int Max;
}arr[MAXN];
int dis[MAXN],n;
int vis[MAXN];

int cmp(node a, node b){
	return a.x < b.x;
}

int cmp1(node a, node b){
	return a.cnt < b.cnt;
}

int main(){
	while (scanf("%d", &n) != EOF){
		for (int i = 1; i <= n; i++){
			scanf("%d%d", &arr[i].x, &arr[i].h);
			arr[i].cnt = i;
			arr[i].ans = 1;
			arr[i].Max = arr[i].x+arr[i].h-1;
		}
		sort(arr+1, arr+1+n, cmp);
		for (int i = n-1; i >= 1; i--){
			int j = i+1;
			int Max = arr[i].Max;
			while (j <= n && arr[j].x <= Max){
				arr[i].ans += arr[j].ans;
				Max = max(Max, arr[j].Max);
				j += arr[j].ans;
			}
			arr[i].Max = Max;
		}
		sort(arr+1, arr+1+n, cmp1);
		for (int i = 1; i < n; i++)
			printf("%d ", arr[i].ans);
		printf("%d\n", arr[n].ans);
	}
	return 0;
}


FZU 2163 多米诺骨牌,布布扣,bubuko.com

FZU 2163 多米诺骨牌

标签:des   blog   class   code   c   http   

原文地址:http://blog.csdn.net/u011345136/article/details/25889119

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!