CF D1 求 Hack
  • 板块学术版
  • 楼主ForgotDream_CHN
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/5/15 00:39
  • 上次更新2023/10/23 15:42:01
查看原帖
CF D1 求 Hack
750067
ForgotDream_CHN楼主2023/5/15 00:39
int n;
std::cin >> n;

std::vector<i64> a(n);
for (int i = 0; i < n; i++) {
  std::cin >> a[i];
}

std::vector f(n + 1, std::vector<i64>(n + 1));
auto min = f, max = f;
for (int len = 1; len <= n; len++) {
  for (int l = 0; l + len - 1 < n; l++) {
    int r = l + len - 1;
    if (len == 1) {
      f[l][r] = 0;
      min[l][r] = max[l][r] = a[l];
      continue;
    }
    min[l][r] = std::min(min[l][r - 1], min[l + 1][r]);
    max[l][r] = std::max(max[l][r - 1], max[l + 1][r]);
    f[l][r] = r - l;
    if (a[l] < min[l + 1][r]) {
      f[l][r] = std::min(f[l][r], f[l + 1][r]);
    }
    if (a[r] > max[l][r - 1]) {
      f[l][r] = std::min(f[l][r], f[l][r - 1]);
    }
  }
}

i64 ans = 0;
for (int len = 1; len <= n; len++) {
  for (int l = 0; l + len - 1 < n; l++) {
    int r = l + len - 1;
    ans += f[l][r];
  }
}

std::cout << ans << "\n";

return;
2023/5/15 00:39
加载中...