线段树最后一个点TLE,有人能帮帮优化吗
查看原帖
线段树最后一个点TLE,有人能帮帮优化吗
817442
Sakuya_maid楼主2023/7/20 14:00
#include <bits/stdc++.h>

using namespace std;
using LL = long long;

constexpr int N = 2e6 + 5;

int w[N];

struct Node
{
    int l, r, f, val;
}stg[N * 4];

void pushup(int k)
{
    stg[k].val = min(stg[k << 1].val, stg[k << 1 | 1].val);
}

inline void build(int l, int r, int k = 1)
{
    stg[k].l = l, stg[k].r = r;

    if(l == r)
    {
        stg[k].val = w[l];
        return;
    }

    int mid = (l + r) >> 1;

    if(l <= mid)build(l, mid, k << 1);
    if(r > mid)build(mid + 1, r, k << 1 | 1);

    pushup(k);
}

inline int query(int x, int y, int k = 1)
{
    int l = stg[k].l, r = stg[k].r;

    if(x <= l && y >= r)
    {
        return stg[k].val;
    }

    int mid = (l + r) >> 1, v = 999999999;

    if(x <= mid)v = min(query(x, y, k << 1), v);
    if(y > mid)v = min(v, query(x, y, k << 1 | 1));

    return v;
}

void solve()
{
    int n, m;
    
    cin >> n >> m;

    for(int i = 1; i <= n; ++ i)cin >> w[i];

    build(1, n);

    for(int i = 1; i <= n; ++ i)
    {
        if(i == 1)cout << 0 << '\n';
        else if(i == 2)cout << w[1] << '\n';
        else{
            int l = max(1, i - m);
            int r = i - 1;
            cout << query(l, r) << '\n';
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // int T;
    // for (cin >> T; T -- ; )
        solve();

}
2023/7/20 14:00
加载中...