上周abc的D题,排序后滑动窗口用线段树维护最大位置和最小位置为什么会超时呢?请求大佬指点
#include<iostream>
#include<vector>
#include<algorithm>
#define lc p<<1
#define rc p<<1|1
using namespace std;
const int N = 2E5 + 7;
struct Node {
int a, id;
}a[N];
bool cmp(Node a, Node b) {
return a.a < b.a;
}
struct Node2 {
int mx, mn;
}t[N << 2];
void pushup(int p) {
t[p].mx = max(t[lc].mx, t[rc].mx);
t[p].mn = min(t[lc].mn, t[rc].mn);
}
void pushdown(int p) {
}
pair<int, int> query(int p, int L, int R,int l,int r) {
if (L > r || R < l) return { 0 ,1e9};
if (L <= l && r <= R) {
return { t[p].mx,t[p].mn };
}
int m = l + r >> 1;
pushdown(p);
pair<int, int>res = { 0,1e9 };
res.first = max(query(lc, L, R,l,m).first, query(rc, L, R,m+1,r).first);
res.second = min(query(lc, L, R,l,m).second, query(rc, L, R,m+1,r).second);
return res;
}
void build(int p, int l, int r) {
t[p] = { a[l].id,a[r].id };
if (l == r)return;
int m = l + r >> 1;
build(lc, l, m);
build(rc, m + 1, r);
pushup(p);
}
void solve() {
int n, k; cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i].a; a[i].id = i;
}
sort(a + 1, a + 1 + n, cmp);
build(1, 1, n);
int kk = 1, ans = 1e9;
int Last = 1;
for (int i = 1; i <= n; i++, kk++) {
if (kk == k) {
pair<int, int>pii = query(1, Last, i,1,n);
int mx = pii.first, mn = pii.second;
ans = min(ans, mx - mn);
kk--;
Last++;
}
}cout << ans << endl;
}
int main() {
solve();
return 0;
}