跳到主要内容

Kangaroos

信息

此题目来自 洛谷, 原始题目与提交代码请前往 P6349 [PA 2011] Kangaroos - 洛谷

题目描述

给出长为 nn 的序列 aa,第 ii 个元素是一个区间 [li,ri][l_i,r_i]

mm 次询问,给出 A,BA,B,求出 aa 中最长的区间(即这个序列中的一段),使得这个区间内每个区间都与 [A,B][A,B] 有交集。输出这个最长区间的长度。

第一行两个整数 n,mn,m

接下来 nn 行,第 ii 行两个整数 li,ril_i,r_i

接下来 mm 行,每行两个整数 A,BA,B,为一次询问。

输入格式

第一行两个整数 n,mn,m

接下来 nn 行,第 ii 行两个整数 li,ril_i,r_i

接下来 mm 行,每行两个整数 A,BA,B,为一次询问。

输出格式

输出 mm 行,每行一个整数,为询问的答案。

输入输出样例

输入 #1

3 3
2 5
1 3
6 6
3 5
1 10
7 9

输出 #1

2
3
0

说明/提示

1n5×104{1}\le{n}\le{{5}\times{10^{4}}}1m2×105{1}\le{m}\le{{2}\times{{10}^{5}}}1liri109{1}\le{{l}_{i}}\le{{r}_{i}}\le{{10}^{9}}1AB109{1}\le{A}\le{B}\le{{10}^{9}}

题目解答

直接一个个进行比对即可。

/**
* 洛谷 P6349 解答程序。
* @author CoolCLK
*/
#include <iostream>
#include <vector>
#define repeat(n) for (size_t _ = 0; _ < n; _++)
typedef unsigned int u_int;
using namespace std;

u_int n, m;
vector<pair<u_int, u_int>> intervals(0);
vector<u_int> answers(0);

int main() {
cin >> n >> m;
repeat(n) {
u_int l, r;
cin >> l >> r;
intervals.push_back(pair<u_int, u_int>(l, r));
}
repeat(m) {
u_int A, B;
cin >> A >> B;
u_int ans = 0;
u_int len = 0;

for (auto& interval : intervals) {
if (interval.first <= B && interval.second >= A) {
len++;
if (len > ans) ans = len;
} else {
len = 0;
}
}
answers.push_back(ans);
}
for (auto& ans : answers) {
cout << ans << endl;
}
return 0;
}