Skip to content

Latest commit

 

History

History
67 lines (53 loc) · 2.47 KB

2808.md

File metadata and controls

67 lines (53 loc) · 2.47 KB

空间换时间 2808: 校门外的树

题目要求计算马路上除去有重叠区域后剩余区域的数量。

题目来源

2808: 校门外的树

总时间限制: 1000ms 内存限制: 65536kB

描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入

输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出

输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

样例输入

500 3
150 300
100 200
470 471

样例输出

298

这个题是以整数坐标形式给出的,可以考虑线段树等数据结构,但题目的规模较小,可以用整数数组来记录未建地铁区域的坐标,最后统计剩余区域的数量即可。

#include <iostream>
#include <cstring>
using namespace std;
int main() {
	int L, M, i, j, sum = 0;
	cin >> L >> M;
	int *tree = new int[L + 1];
	memset(tree, 0, sizeof(int) * (L + 1));
	for (i = 0; i < M; ++i) {
		int s, e;
		cin >> s >> e;
		for (j = s; j <= e; ++j) {
			tree[j] = 1;
		}
	}
	for (i = 0; i < L + 1; ++i) {
		if (tree[i] == 0) {
			sum++;
		}
	}
	cout << sum << endl;
	delete[] tree;
	return 0;
}

2808.cpp 代码长度:414B 内存:200kB 时间:10ms 通过率:94% 最小内存:200kB 最短时间:1ms

这里我用动态内存分配来构建基本的数据结构,当然也可以分配较大的静态数组空间,每次读取一个区间就把数组对应区域置1,最后判断累加剩余空间数量即可。

有任何的改进意见欢迎大家在微信平台公众号主页面留言或者发表issue。