【线段树】个人训练-Leetcode-3161. Block Placement Queries

[复制链接]
发表于 2026-1-11 19:53:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
标题链接:https://leetcode.cn/problems/block-placement-queries/description/
标题大意:在x轴上,有两种操纵:

  • 在某个点上插入一个停滞物
  • 查询,在[0, x]区间内,能否放下长度为sz的物品
插入和查询操纵瓜代举行,返回每次查询的结果。
思绪:一开始时望见标题写的"anywhere"以为是【区间内每处都能放下物品】,寻思着那不是整个区间都没有停滞物才行吗,似乎判断有点简朴了。厥后才发现只要有一处能放下就行了。
那实在就是查询[0, x]区间内,被停滞物隔开的各个区间中,能存储的最大长度。这种涉及区间查询的,应该用线段树来办理。然而长期不写已经忘了线段树怎么写了…看了很多题解,照旧灵神的比力清楚。
更新i处的值为val
  1.         void update(int o, int l, int r, int i, int val) {
  2.         if (l == r) {
  3.             tree[o] = val;
  4.             return;
  5.         }
  6.         int mid = (l + r) / 2;
  7.         if (i <= mid)
  8.             update(o * 2, l, mid, i, val);
  9.         else
  10.             update(o * 2 + 1, mid+1, r, i, val);
  11.         tree[o] = max(tree[o * 2], tree[o*2 + 1]);
  12.     }
复制代码
返回[0, x]中最大的区间长度
  1.         int query(int o, int l, int r, int x) {
  2.         if (r <= x)
  3.             return tree[o];
  4.         int mid = (l + r) / 2;
  5.         if (x <= mid)
  6.             return query(o * 2, l, mid, x);
  7.         return max(tree[o * 2], query(o * 2 + 1, mid + 1, r, x));
  8.     }
复制代码
对于[0, x]来说,要么最大长度在[0, pre](pre是x左边的最大的停滞物位置)之间,要么在[pre, x]之间(由于每个query中x实在也相称于一个暂时的停滞)。
完备代码
  1. class Solution {
  2. public:
  3.     vector<int> tree;
  4.     void update(int o, int l, int r, int i, int val) {
  5.         if (l == r) {
  6.             tree[o] = val;
  7.             return;
  8.         }
  9.         int mid = (l + r) / 2;
  10.         if (i <= mid)
  11.             update(o * 2, l, mid, i, val);
  12.         else
  13.             update(o * 2 + 1, mid+1, r, i, val);
  14.         tree[o] = max(tree[o * 2], tree[o*2 + 1]);
  15.     }
  16.     int query(int o, int l, int r, int x) {
  17.         if (r <= x)
  18.             return tree[o];
  19.         int mid = (l + r) / 2;
  20.         if (x <= mid)
  21.             return query(o * 2, l, mid, x);
  22.         return max(tree[o * 2], query(o * 2 + 1, mid + 1, r, x));
  23.     }
  24.     vector<bool> getResults(vector<vector<int>>& queries) {
  25.         int maxn = 0;
  26.         for (auto q : queries)
  27.             maxn = max(maxn, q[1]);
  28.         maxn++;
  29.         
  30.         set<int> st{0, maxn};
  31.         tree.resize(2 << (32 - __builtin_clz(maxn)));
  32.         vector<bool> res;
  33.         
  34.         for (auto q : queries) {
  35.             int x = q[1];
  36.             auto it = st.lower_bound(x);
  37.             int pre = *std::prev(it);
  38.             if (q[0] == 1) {
  39.                 int nxt = *it;
  40.                 st.insert(x);
  41.                 update(1, 0, maxn, x, x - pre);
  42.                 update(1, 0, maxn, nxt, nxt - x);
  43.             }
  44.             else {
  45.                 int maxlen = max(query(1, 0, maxn, pre), x - pre);
  46.                 res.push_back(maxlen >= q[2]);
  47.             }
  48.         }
  49.         return res;
  50.     }
  51. };
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表