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;
}