第三道,90% #include <iostream> #include <cstdio> #include <cstring> #include <cctype> #include <vector> #include <string> #include <map> #include <set> #include <cmath> #include <iterator> #include <algorithm> #include <functional> using namespace std; const int MAXN = 20005; struct segment {     int left, right;     int mx, mark; }; int n, k; vector<double> a, v_left, v_right; segment tree[MAXN << 2]; void push_up(int rt) {     tree[rt].mx = max(tree[rt << 1].mx, tree[rt << 1 | 1].mx); } void push_down(int rt) {     if (tree[rt].mark) {         tree[rt << 1].mx += tree[rt].mark;         tree[rt << 1 | 1].mx += tree[rt].mark;         tree[rt << 1].mark += tree[rt].mark;         tree[rt << 1 | 1].mark += tree[rt].mark;         tree[rt].mark = 0;     } } void build(int l, int r, int rt) {     tree[rt].left = l;     tree[rt].right = r;     tree[rt].mark = 0;     if (l == r)         tree[rt].mx = 0;     else {         int mid = (l + r) >> 1;         build(l, mid, rt << 1);         build(mid + 1, r, rt << 1 | 1);         push_up(rt);     } } void modify(int l, int r, int rt) {     if (l <= tree[rt].left && tree[rt].right <= r) {         tree[rt].mx += 1;         tree[rt].mark += 1;         return;     }     push_down(rt);     int mid = (tree[rt].left + tree[rt].right) >> 1;     if (l <= mid) modify(l, r, rt << 1);     if (r >= mid + 1) modify(l, r, rt << 1 | 1);     push_up(rt); } int query(int l, int r, int rt) {     if (l <= tree[rt].left && tree[rt].right <= r)         return tree[rt].mx;     push_down(rt);     int ans = 0, mid = (tree[rt].left + tree[rt].right) >> 1;     if (l <= mid) ans = max(ans, query(l, r, rt << 1));     if (r >= mid + 1) ans = max(ans, query(l, r, rt << 1 | 1));     return ans; } int main() {     // freopen("in.txt", "r", stdin);     cin >> n >> k;     for (int i = 0; i < n; i++) {         double l, r;         cin >> l >> r;         v_left.push_back(l);         v_right.push_back(r);         a.push_back(l);         a.push_back(r);     }     sort(a.begin(), a.end());     a.erase(unique(a.begin(), a.end()), a.end());     build(1, a.size(), 1);     for (int i = 0; i < n; i++) {         int l = lower_bound(a.begin(), a.end(), v_left[i]) - a.begin() + 1;         int r = lower_bound(a.begin(), a.end(), v_right[i]) - a.begin() + 1;         modify(l, r - 1, 1);     }     int left = 0, right = 0;     vector<pair<double, double>> ans;     for (int i = 1; i <= (int)a.size(); i++) {         int q = query(i, i, 1);         if (q >= k) {             if (left == 0)                 left = i, right = i;             else                 right = i;         }         else {             if (left != 0) {                 ans.push_back(make_pair(a[left - 1], a[right]));                 left = 0;             }         }     }     cout << ans.size() << endl;     for (auto p: ans)         cout << p.first << " " << p.second << endl;     return 0; }
点赞 评论

相关推荐

程序员流年:真的别再用外卖+点评了。真的找小厂也费劲,如果你碰壁了可以看我主页,换个好项目,再去试试,给自己找找亮点
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务