标签:
因为思念新宿的"小姐姐"们,岛娘计划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; }
标签:
原文地址:http://blog.csdn.net/ouyangjinbin/article/details/51346420