首页 > 其他分享 >洛谷 P1712 [NOI2016] 区间

洛谷 P1712 [NOI2016] 区间

时间:2022-12-19 13:55:20浏览次数:50  
标签:10 lazy ch 洛谷 int pos P1712 NOI2016 le

很多套路糅合在一起的一道题。

记 \(len_i = r_i - l_i\)。

则所求转化为一个有 \(m\) 个区间的集合 \(S\),满足:

  • 存在一个 \(x\),使得对于所有 \(S\) 中的区间 \(i\),有 \(l_i \le x \le r_i\)。
  • \(\max\limits_{i \in S}\{len_i\} - \min\limits_{i \in S}\{len_i\}\) 最小。

对于第二个限制条件,套路地想到按区间长度排序后尺取。

此时时间复杂度为 \(\mathcal{O}(n)\),也就是说,要在 \(\mathcal{O}(\log n)\) 的时间复杂度内进行第一个限制条件的判断。

对于第一个限制条件,\(l_i, r_i \le 10^9\),但 \(n \le 5 \times 10^5\),离散化后即可实现 \(l_i, r_i \le 10^6\)。开一个线段树,维护被覆盖次数最多的点被覆盖的次数,每次只需判断 \(1\) 号结点上的值是否 \(\ge m\) 即可。

时间复杂度 \(\mathcal{O}(n \log n)\)。

代码:

#include <bits/stdc++.h>

#define MAXN 500100
#define lson pos << 1
#define rson pos << 1 | 1

using namespace std;

int n, m, tmp[MAXN << 1];

struct Seg {
    int w, lazy;
} t[MAXN << 3];

struct Node {
    int l, r;

    bool operator<(const Node &rhs) const {
        return r - l > rhs.r - rhs.l;
    }
} a[MAXN], b[MAXN];

template<typename _T>
void read(_T &_x) {
    _x = 0;
    _T _f = 1;
    char _ch = getchar();
    while (_ch < '0' || '9' < _ch) {
        if (_ch == '-') _f = -1;
        _ch = getchar();
    }
    while ('0' <= _ch && _ch <= '9') {
        _x = (_x << 3) + (_x << 1) + (_ch & 15);
        _ch = getchar();
    }
    _x *= _f;
}

template<typename _T>
void write(_T _x) {
    if (_x < 0) {
        putchar('-');
        _x = -_x;
    }
    if (_x > 9) write(_x / 10);
    putchar('0' + _x % 10);
}

void pushdown(int pos) {
    if (!t[pos].lazy) return;
    t[lson].w += t[pos].lazy, t[rson].w += t[pos].lazy;
    t[lson].lazy += t[pos].lazy, t[rson].lazy += t[pos].lazy;
    t[pos].lazy = 0;
}

void upd(int pos, int l, int r, int x, int y, int c) {
    if (x <= l && r <= y) {
        t[pos].w += c;
        t[pos].lazy += c;
        return;
    }
    pushdown(pos);
    int mid = (l + r) >> 1;
    if (x <= mid) upd(lson, l, mid, x, y, c);
    if (y > mid) upd(rson, mid + 1, r, x, y, c);
    t[pos].w = max(t[lson].w, t[rson].w);
}

int main() {
    read(n), read(m);
    for (int i = 1; i <= n; i++) {
        read(a[i].l), read(a[i].r);
        tmp[++tmp[0]] = a[i].l, tmp[++tmp[0]] = a[i].r;
    }
    sort(a + 1, a + n + 1);
    sort(tmp + 1, tmp + tmp[0] + 1);
    for (int i = 1; i <= n; i++) {
        b[i].l = lower_bound(tmp + 1, tmp + tmp[0] + 1, a[i].l) - tmp;
        b[i].r = lower_bound(tmp + 1, tmp + tmp[0] + 1, a[i].r) - tmp;
    }
    int l = 1, r = 0, ans = 2e9;
    while (r < n) {
        while (t[1].w < m && r < n) {
            r++;
            upd(1, 1, tmp[0], b[r].l, b[r].r, 1);
        }
        while (t[1].w >= m && l <= r) {
            ans = min(ans, (a[l].r - a[l].l) - (a[r].r - a[r].l));
            upd(1, 1, tmp[0], b[l].l, b[l].r, -1);
            l++;
        }
    }
    write(ans == 2e9 ? -1 : ans);
    return 0;
}

标签:10,lazy,ch,洛谷,int,pos,P1712,NOI2016,le
From: https://www.cnblogs.com/chy12321/p/16991968.html

相关文章

  • 洛谷P3224 [HNOI2012]永无乡 题解 splay tree 启发式合并
    题目链接:https://www.luogu.com.cn/problem/P3224主要知识点是:树上启发式合并,即每次合并将小的树里面的每个点合并大大的树里面,时间复杂度\(O(n\log^2n)\)。同时需要......
  • 洛谷-P1450 硬币购物
    P1450硬币购物容斥||\(dp\)+单调队列优化容易看出是个多重背包,然后拿单调队列优化一下后,计算量为\(O(4ns)\)这种做法的话就是单调队列优化板子题#include<bits/......
  • P1173 [NOI2016]网格
    链接:https://www.luogu.com.cn/problem/P1173题目描述:有一个\(n\timesm\)的棋盘,有\(c\)只蛐蛐,求再放置多少只蛐蛐可以使图中其他部分被分成两部分。题解:由于可以在这个......
  • [NOI2016]循环之美
    链接:https://www.luogu.com.cn/problem/P1587题目描述:求有多少个$\frac{a}{b}(1<=a<=n,1<=b<=m)$在$k$进制下是纯循环小数$(注意:相等的数只算一次)$。题解:可以发现$\f......
  • 洛谷 P1020 导弹拦截(递增子串 DP )
    题目大意:有一个数列,我们要获取一组子串,这个子串必须单调不增。问:(1)最长我们可以获取多长的这种子串(2)这个数列中最多有多少种这种子串解题思路:其中问题一是很典型的DP问题,最......
  • 洛谷 P1087 FBI树
    题目大意:已知一棵树由字符串组成,规定:若节点全1把这节点称为I节点。若节点全0把节点称为B节点。若节点含0同时含1把节点称为F节点。现在有一个字符串N长,左子树是前一半字......
  • 洛谷 P1088 火星人(乱搞)
    题目大意:已知有一串数字,问在原来的数字串的字典序加m后,应该输出多少解题思路:最简便的做法是用next_permutation,这个生成的全排列可以按照字典序递增,这里我用的是搜索的方法......
  • 洛谷 P1113 杂务(拓扑排序,递归)
    题目大意:有一个有向无圈图,每个节点看作一个任务,一个任务需要完成必须先完成父亲节点的任务,每个任务都有耗时。假设现在所有不相关任务都可以并行执行,问最短多少时间可以把所......
  • 洛谷 P1996 约瑟夫问题
    问题简介:小朋友围城一圈,从1号开始报数,报到M的那位同学出局,然后下一位同学报1,循环上述过程直到所有同学出局。输出依次出局的小朋友的号码解题思路:没什么好说的,就是模拟,出局......
  • 洛谷 P1233 木棍加工(贪心,递增子串DP)
    题目大意:有矩形A1,A2......An.每个矩形有长宽w,h。现在已知cost:(1)若矩形a的w,h小于矩形b的w,h,那么没有cost(2)其它情况cost+1.现在已知矩形A1,A2...,问怎么得到最少cost.解题思......