线段树之应用 ---- #1299 : 打折机票

#1299 : 打折机票

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

 因为思念新宿的"小姐姐"们,岛娘计划6月份再去一趟东京,不过这次看来她需要自掏腰包。经过了几天的夜战,岛娘终于在体力耗尽之前,用Python抓下了所有6月份,上海至东京的全部共 n 张机票。现在请你帮助债台高筑的岛娘筛选出符合时间区间要求的,最贵的机票。

输入

输入数据的第一行包含两个整数 n, m(1 ≤ n, m ≤ 105),分别表示机票的总数,和询问的总数。接下来的 n 行,每行两个整数 t, v (1 ≤ t, v ≤ 105),表示每张机票出发的时间和价格。 接下来的 m 行,每行两个整数 a, b (1 ≤ a ≤ b ≤ 105),表示每个询问所要求的时间区间。

输出

对于每组询问,输出一行表示最贵的价格。如果没有符合要求的机票,输出一行"None"。

样例输入
7 6
1 1
2 1
4 3
4 4
4 5
6 9
7 9
1 7
1 2
6 7
3 3
4 4
5 5
样例输出
9
1
9
None
5
None
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>  
#include<cstring>
const int N = 100000;

struct tree
{
	int left, right;
	int maxn;
}s[4 * N]; //一般长度为N的区间,所需节点个数不超过四倍

int a[N];

inline int Max(int a, int b) {
	return a > b ? a : b;
}

void build(int l, int r, int p)
{
	s[p].left = l;
	s[p].right = r;
	if (l == r)
	{
		s[p].maxn = a[l]; //在长度为0的节点处设置maxn
		return;
	}

	int mid = (l + r) / 2;
	build(l, mid, p << 1); //左孩子
	build(mid + 1, r, p << 1 | 0X01); //右孩子

	s[p].maxn = Max(s[p << 1].maxn, s[p << 1 | 0x01].maxn);
}

int search(int l, int r, int p)
{
	if (l <= s[p].left && s[p].right <= r) //如果查询区间包含当前区间
	{
		return s[p].maxn;
	}
	int mid = (s[p].left + s[p].right) / 2;
	if (l > mid) //全在右区间
		return search(l, r, p << 1 | 1);
	else if (r <= mid) //全在左区间
		return search(l, r, p << 1);
	else
		return Max(search(l, mid, p << 1), search(mid + 1, r, p << 1 | 0x01));
}

int main()
{
	int n, m;

	scanf("%d%d", &n, &m);
	memset(a, 0, sizeof(a));

	int t, v;
	for (int i = 0; i<n; i++)
	{
		scanf("%d%d", &t, &v);
		a[t] = Max(a[t], v);
	}

	build(1, 100000, 1); //创建线段树

	int l, r;
	for (int i = 0; i<m; i++)
	{
		scanf("%d%d", &l, &r);
		int ans = search(l, r, 1);
		if (!ans)
			printf("None\n");
		else
			printf("%d\n", ans);
	}

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值