• CodeForces


    ( ext{Description})

    传送门

    ( ext{Solution})

    你会发现这道题和先后顺序没有关系,对于一道菜,只要能买这个菜的人发现它能买的菜没有或买光了,这个菜就会被买。

    我们在线段树上以菜为 (1),人为 (-1),每来一个菜或人就就将其权值插入 ([1,val])。这样找到最大权值大于 (0) 的即为答案。

    ( ext{Code})

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int N = 300002, Limit = 1000000;
    int n, m, q, a[N], b[N], st[Limit << 2], la[Limit << 2];
    void pushDown(const int u) {
        if(la[u]) {
            la[u << 1] += la[u];
            la[u << 1 | 1] += la[u];
            st[u << 1] += la[u];
            st[u << 1 | 1] += la[u];
            la[u] = 0;
        }
    }
    void add(const int id, const int l, const int r, const int L, const int R, const int num) {
        if(L <= l && R >= r) {
            la[id] += num;
            st[id] += num;
            return;
        }
        pushDown(id);
        int mid = l + r >> 1;
        if(L <= mid)
            add(id << 1, l, mid, L, R, num);
        if(R > mid)
            add(id << 1 | 1, mid + 1, r, L, R, num);
        st[id] = max(st[id << 1], st[id << 1 | 1]);
    }
    int ask(const int id, const int l, const int r) {
        if(l == r)
            return l;
        int mid = l + r >> 1;
        pushDown(id);//C
        if(st[id << 1 | 1] > 0)//D
            return ask(id << 1 | 1, mid + 1, r);
        return ask(id << 1, l, mid);
    }
    int main() {
        int f, x, y;
        scanf("%d %d", &n, &m);
        for(int i = 1; i <= n; i ++) {
            scanf("%d", &a[i]);
            add(1, 1, Limit, 1, a[i], 1);//E
        }
        for(int i = 1; i <= m; i ++) {
            scanf("%d", &b[i]);
            add(1, 1, Limit, 1, b[i], -1);
        }
        scanf("%d", &q);
        while(q --) {
            scanf("%d %d %d", &f, &x, &y);
            if(f == 1) {
                add(1, 1, Limit, 1, a[x], -1);//A
                add(1, 1, Limit, 1, y, 1);
                a[x] = y;
            }
            else {
                add(1, 1, Limit, 1, b[x], 1);
                add(1, 1, Limit, 1, y, -1);
                b[x] = y;
            }
            if(st[1] > 0)//B
                printf("%d
    ", ask(1, 1, Limit));
            else
                printf("-1
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    错误页面提示大全
    http协议基础知识
    初识性能测试
    seo
    测试工程师的分类和发展方向
    Jsessionid和cookie的区别与联系
    nginx配置
    复盘能力
    开发自测方法
    OKR 目标关键成果法
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/13545358.html
Copyright © 2020-2023  润新知