线段树全WA求调
查看原帖
线段树全WA求调
746944
PaluAix楼主2023/10/25 18:19

RT,自认为码风不错

#include <bits/stdc++.h>
#define LC p << 1
#define RC p << 1 | 1
using namespace std;
const int N = 1e6 + 5;
int a[N], n, m, c, INF = 0x7fffffff;
struct P4392 {
  int l, r, MaxVal, MinVal;
} t[N << 3];

void PushUp(int p) {
  t[p].MinVal = min(t[LC].MinVal, t[RC].MinVal);
  t[p].MaxVal = max(t[LC].MaxVal, t[RC].MaxVal);
}

void Build(int p, int l, int r) {
  t[p].l = l, t[p], r = r;
  if (l == r) {
    t[p].MaxVal = t[p].MinVal = a[l];
    return;
  }
  int mid = (l + r) >> 1;
  Build(LC, l, mid);
  Build(RC, mid + 1, r);
  PushUp(p);
  return;
}

int Range_Ask_Max(int p, int l, int r) {
  if (t[p].l >= l && t[p].r <= r)
    return t[p].MaxVal;
  int mid = (t[p].l + t[p].r) >> 1, ans = -INF;
  if (l <= mid)
    ans = max(ans, Range_Ask_Max(LC, l, r));
  if (r > mid)
    ans = max(ans, Range_Ask_Max(RC, l, r));
  return ans;
}

int Range_Ask_Min(int p, int l, int r) {
  if (t[p].l >= l && t[p].r <= r)
    return t[p].MinVal;
  int mid = (t[p].l + t[p].r) >> 1, ans = INF;
  if (l <= mid)
    ans = min(ans, Range_Ask_Min(LC, l, r));
  if (r > mid)
    ans = min(ans, Range_Ask_Min(RC, l, r));
  return ans;
}
int main() {
  bool flag = 0;
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= n; i++)
    scanf("%d", &a[i]);
  Build(1, 1, n);
  for (int i = 1; i <= n - m + 1; i++) {
    if (Range_Ask_Max(1, i, i + m - 1) - Range_Ask_Min(1, i, i + m - 1) <= c) {
      printf("%d\n", i);
      flag = 1;
    }
  }
  if (!flag)
    printf("NONE\n");
  system("pause");
  return 0;
}
2023/10/25 18:19
加载中...