chenfy27的刷题记录

导航

abc382C Kaiten Sushi

N个人排成一排,第i个人的口味度为A[i];M块寿司放在传送带上依次经过这N个人,第i块寿司的美味度为B[i]。如果寿司的美味度不低于当前人的口味度,则会吃掉寿司,问各块寿司会被谁吃掉,如果都不吃,输出-1。
1<=N,M,A[i],B[i]<=2E5

分析:从左到右枚举各块寿司,在口味度数组中找第1个满足值小于等于它的位置,可以用线段树二分来做。

#include <bits/stdc++.h>
using i64 = long long;

// SegmentTree模板...

struct Info {
    int min;
    Info(int v=0):min(v) {}
    friend Info operator+(const Info &a, const Info &b) {
        Info ans;
        ans.min = std::min(a.min, b.min);
        return ans;
    }
};

void solve() {
    int N, M;
    std::cin >> N >> M;
    std::vector<int> A(N), B(M);
    for (int i = 0; i < N; i++) {
        std::cin >> A[i];
    }
    for (int i = 0; i < M; i++) {
        std::cin >> B[i];
    }
    SegmentTree<Info> tr;
    tr.init(A);
    std::vector<int> ans(M, -1);
    for (int i = 0; i < M; i++) {
        int x = tr.findFirst(0, N, [&](const Info &v) {
            return v.min <= B[i];
        });
        if (x != -1) {
            ans[i] = x + 1;
        }
    }
    for (int i = 0; i < M; i++) {
        std::cout << ans[i] << "\n";
    }
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

posted on 2024-12-02 12:14  chenfy27  阅读(7)  评论(0编辑  收藏  举报