【题目链接】
【思路要点】
- 从左到右枚举交集的左端点,用堆维护最大的\(K\)个右端点即可。
- 时间复杂度\(O(NLogN)\)。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 1000005; template <typename T> void chkmax(T &x, T y) {x = max(x, y); } template <typename T> void chkmin(T &x, T y) {x = min(x, y); } template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); } template <typename T> void writeln(T x) { write(x); puts(""); } struct info { pair <int, int> val; int home; }; int n, k, ans, l, r; info a[MAXN]; bool cmp(info a, info b) {return a.val < b.val; } priority_queue <int, vector <int>, greater <int> > Heap; int main() { read(n), read(k); for (int i = 1; i <= n; i++) read(a[i].val.first), read(a[i].val.second), a[i].home = i; sort(a + 1, a + n + 1, cmp); for (int i = 1; i <= n; i++) { Heap.push(a[i].val.second); if (Heap.size() > k) Heap.pop(); if (Heap.size() == k && Heap.top() - a[i].val.first > ans) { ans = Heap.top() - a[i].val.first; l = a[i].val.first; r = Heap.top(); } } printf("%d\n", ans); if (ans == 0) { for (int i = 1; i <= k; i++) printf("%d ", i); } else { for (int i = 1; i <= n; i++) if (a[i].val.first <= l && a[i].val.second >= r) { printf("%d ", a[i].home); if (--k == 0) return 0; } } return 0; }