悬关 代码求调
  • 板块灌水区
  • 楼主yan_wang
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/10 15:04
  • 上次更新2024/8/10 15:58:06
查看原帖
悬关 代码求调
987885
yan_wang楼主2024/8/10 15:04

T494185 BRPT/QPS/SWM/BRGS/MNHT/DIT/DIT/FIC/AST

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

class SegmentTree {
public:
    SegmentTree(const vector<int>& arr) {
        n = arr.size();
        tree.resize(4 * n);
        build(arr, 0, 0, n - 1);
    }

    void rebuild(const vector<int>& arr) {
        build(arr, 0, 0, n - 1);
    }

    int queryMin(int l, int r) {
        return query(0, 0, n - 1, l, r);
    }

private:
    int n;
    vector<int> tree;

    void build(const vector<int>& arr, int node, int start, int end) {
        if (start == end) {
            tree[node] = arr[start];
        } else {
            int mid = (start + end) / 2;
            build(arr, 2 * node + 1, start, mid);
            build(arr, 2 * node + 2, mid + 1, end);
            tree[node] = min(tree[2 * node + 1], tree[2 * node + 2]);
        }
    }

    int query(int node, int start, int end, int l, int r) {
        if (r < start || l > end) return INT_MAX;
        if (l <= start && r >= end) return tree[node];
        int mid = (start + end) / 2;
        int left_min = query(2 * node + 1, start, mid, l, r);
        int right_min = query(2 * node + 2, mid + 1, end, l, r);
        return min(left_min, right_min);
    }
};

void partitionAndReconstruct(vector<int>& arr, vector<int>& index, SegmentTree& segTree, int l, int r) {
    vector<pair<int, int>> subarray;
    for (int i = l; i <= r; ++i) {
        subarray.push_back({arr[i], index[i]});
    }
    sort(subarray.begin(), subarray.end());
    for (int i = 0; i < subarray.size(); ++i) {
        arr[l + i] = subarray[i].first;
        index[l + i] = subarray[i].second;
    }
    segTree.rebuild(arr);  // 重新构建线段树
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> arr(n);
    vector<int> index(n);
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
        index[i] = i + 1;  // 1-based index
    }

    SegmentTree segTree(arr);

    for (int i = 0; i < m; ++i) {
        int op, l, r;
        cin >> op >> l >> r;
        l--; r--;  // 转换为0索引

        if (op == 1) {
            int minValue = segTree.queryMin(l, r);
            for (int j = l; j <= r; ++j) {
                if (arr[j] == minValue) {
                    cout << minValue << " " << index[j] << endl;
                    break;
                }
            }
        } else if (op == 2) {
            partitionAndReconstruct(arr, index, segTree, l, r);
        }
    }

    return 0;
}
2024/8/10 15:04
加载中...