楼主:
sixB (6B)
2025-08-07 00:54:58※ 引述《JIWP (神楽めあ的钱包)》之铭言:
: 3479. Fruits Into Baskets III
昨天那题我没写
这题看完没什么想法
区间最大 区间修改
懒得思考就线段树吧==
不过这题才medium
不知道有没有更简单的解法
单调什么之类的
看其他人也是用线段树
class Solution {
public:
int numOfUnplacedFruits(vector<int>& fruits, vector<int>& baskets) {
int n = fruits.size();
int sz = n * 4 + 1;
vector<int> tree(sz, 0); // segment_tree for baskets
// [1, n] 1-indexed
init(tree, 1, 1, n, baskets);
int res = 0;
for(int i: fruits){
//cout << i << '\n';
if(tree[1] < i) res++;
else update(tree, 1, 1, n, i);
}
return res;
}
void update(vector<int>& tree, int idx, int l, int r, int i){
if(l == r){
tree[idx] = 0;
return;
}
//cout << idx << ' ' << l << " " << r << '\n';
int m = l + (r - l) / 2;
if(tree[idx*2] >= i){ // leftest
update(tree, idx*2, l, m, i);
}
else{
update(tree, idx*2 + 1, m + 1, r, i);
}
tree[idx] = max(tree[idx*2], tree[idx*2 + 1]);
}
void init(vector<int>& tree, int idx, int l, int r, vector<int>& baskets){
if(l == r){
tree[idx] = baskets[l-1]; // 0-indexed
return;
}
int m = l + (r - l) / 2;
init(tree, idx*2, l, m, baskets);
init(tree, idx*2 + 1, m+1, r, baskets);
tree[idx] = max(tree[idx*2], tree[idx*2 + 1]);
}
};