Minimizing maximizer

Minimizing maximizer

https://ac.nowcoder.com/acm/problem/106366

Minimizing maximizer

题目大意

有一条长度为的线段,然后会按照顺序给你条线段(固定起点终点)
问,你按照顺序使用这条线段,最少要多少条才能把整条线段覆盖完
但是题目有一个条件,大概就是这条线段至少与之前的覆盖的线段有一个交点

分析

那么这样的话,就可以设计动态转移方程表示从开始覆盖到的最小代价
然后因为要求了一定与前面的线段有交点,所以方程如下:

表示的是枚举到的是第个线段,而并不是一个二维的
然后直接这样维护,它的时间复杂度是,然后观察到这个是查询的一个区间最小值
就是说这个东西大概可以用一个叫做线段树的数据结构来维护一下,这样下来,时间复杂度就变成了
但是需要注意的是,更新的时候,只需要更新右端点的值,其他地方的值其实是没有用的

Code

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;

inline int __read()
{
    int x(0), t(1);
    char o (getchar());
    while (o < '0' || o > '9') {
        if (o == '-') t = -1;
        o = getchar();
    }
    for (; o >= '0' && o <= '9'; o = getchar()) {
        x = (x << 1) + (x << 3) + (o ^ 48);
    }
    return x * t;
}

int ans[maxn << 2];

void update(int l, int r, int p, int val, int x = 1)
{
    if (l == r) {
        ans[x] = min(ans[x], val);
        return ;
    }
    int mid = (l + r) >> 1;
    if (p <= mid) update(l, mid, p, val, x << 1);
    else update(mid + 1, r, p, val, x << 1 | 1);
    ans[x] = min(ans[x << 1], ans[x << 1 | 1]);
}

int query(int l, int r, int tl, int tr, int x = 1)
{
    if (l >= tl && r <= tr) return ans[x];
    int mid = (l + r) >> 1;
    int res(maxn);
    if (tl <= mid) res = min(res, query(l, mid, tl, tr, x << 1));
    if (tr > mid) res = min(res, query(mid + 1, r, tl, tr, x << 1 | 1));
    return res;
}

signed main()
{
    int n = __read(), m = __read();
    memset (ans, 0x3f, sizeof (ans));
    update(1, n, 1, 0);
    while (m--) {
        int s = __read(), t = __read();
        int upt = query(1, n, s, t);
        update(1, n, t, upt + 1);
    }
    printf ("%d\n", query(1, n, n, n));
}
有的没的 文章被收录于专栏

RT,有的没的

全部评论

相关推荐

04-15 23:42
中山大学 Java
ResourceUtilization:过几天楼主就会捧着一堆offer来问牛友们该怎么选辣
点赞 评论 收藏
分享
吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
评论
5
5
分享

创作者周榜

更多
牛客网
牛客企业服务