题解| #小球投盒#

小球投盒

https://www.nowcoder.com/practice/e0e8a6f2ba7747b5a9f8a8dc6fa3e9f1

我看题解都是用map或者set然后分类讨论,那我发一个使用二分加前缀和的思路。我们可以离线把操作记录下来然后二分最少需要几次可以全部覆盖。每次二分我们可以把前mid次操作通过差分和前缀和完成。具体可以看代码

#include<bits/stdc++.h>

using i64 = long long;

void DAOQI() {
    int n, m;
    std::cin >> n >> m;
    std::vector<int> p(n + 2);

    std::vector<std::pair<int, int>> Q(m + 1);
    for (int i = 1; i <= m; i++) std::cin >> Q[i].first >> Q[i].second;

    auto check = [&](int mid) {
        std::fill(p.begin(), p.end(), 0);
        for (int i = 1; i <= mid; i++) {
            auto [op, x] = Q[i];
            if (op == 1) {
                p[x]++, p[x + 1]--;
            } else {
                if (x > 1) p[1]++, p[x]--;
                if (x < n) p[x + 1]++;
            }
        }
        for (int i = 1; i <= n; i++) {
            p[i] += p[i - 1];
            if (p[i] == 0) return false;
        }
        return true;
    };
    int l = 1, r = m, ans = -1;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (check(mid)) {
            ans = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    std::cout << ans << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T = 1;
    //std::cin >> T;
    while (T--) DAOQI();
    return 0;
}

全部评论

相关推荐

昨天 11:16
湖南大学 Web前端
我看到好多人都在说0offer好焦虑,结果一看是投了百度快手字节啥的。好像大家都是只想通过校招进大厂,对小公司是不考虑的吗😂可是能进大厂的难道不是只有少部分人吗,真心发问
梦想是成为七海千秋:沉默的大多数吧,喜欢晒的都是能引起共鸣的大厂,找小厂的人,别人也不认识你这个小厂,就自己偷偷找了实际上大多数人哪有什么机会能找到大厂
点赞 评论 收藏
分享
每晚夜里独自颤抖:这个在牛客不是老熟人了吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务