QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#750672#9540. Double 11PlentyOfPenalty#WA 2ms10172kbC++202.4kb2024-11-15 15:26:212024-11-15 15:26:22

Judging History

你现在查看的是最新测评结果

  • [2024-11-15 15:26:22]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:10172kb
  • [2024-11-15 15:26:21]
  • 提交

answer

#include <bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) begin(x), end(x)
#ifdef memset0
#define log(...) fprintf(stderr, __VA_ARGS__)
#else
#define endl '\n'
#define log(...) ((void)(0))
#endif
using namespace std;
using ll = long long;
using lf = long double;
using ull = unsigned long long;
using lll = __int128;
using pv = pair<lf, int>;

const int N = 400011;
int q[N], p[N];
ll a[N], sum[N];
pv f[N];
pv operator+(pv a, pv b) { return pv(a.first + b.first, a.second + b.second); }
pv calc(int l, int r, lf w) { return pv(w + sqrt(lf(r - l + 1) * (sum[r] - sum[l - 1])), 1); }

int n;
pv solve(lf w) {
  int head = 1, tail = 0;
  f[0] = pv(0, 0);
  for (int i = 1; i <= n; ++i) {
    f[i] = calc(1, i, w);
    while (head < tail && p[head + 1] <= i) head++;
    if (head <= tail) {
      if (f[q[head]] + calc(q[head] + 1, i, w) < f[i]) f[i] = f[q[head]] + calc(q[head] + 1, i, w);
      while (head < tail && p[head + 1] <= i + 1) head++;
      if (head <= tail) p[head] = i + 1;
    }
    //
    int r = n;
    while (head <= tail) {
      if (f[q[tail]] + calc(q[tail] + 1, p[tail], w) > f[i] + calc(i + 1, p[tail], w)) r = p[tail] - 1, tail--;
      else if (f[q[tail]] + calc(q[tail] + 1, r, w) <= f[i] + calc(i + 1, r, w)) {
        if (r < n) q[++tail] = i, p[tail] = r + 1;
        break;
      } else {
        int L = p[tail], R = r;
        while (L < R) {
          int M = (L + R) >> 1;
          if (f[q[tail]] + calc(q[tail] + 1, M, w) <= f[i] + calc(i + 1, M, w)) L = M + 1;
          else
            R = M;
        }
        q[++tail] = i, p[tail] = L;
        break;
      }
    }
    if (head > tail) {
      q[++tail] = i;
      p[tail] = i + 1;
    }
  }
  return f[n];
}
int main() {
#ifdef memset0
  freopen("F.in", "r", stdin);
#endif
  cin.tie(0)->sync_with_stdio(0);
  int m;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  sort(a + 1, a + n + 1);
  for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + a[i];
  lf l = -1e16, r = 1e16;
  for (int k = 1; k <= 200; ++k) {
    lf mid = l + (r - l) / 2;
    pv now = solve(mid);
    int c = now.second;
    if (c == m) {
      printf("%.12lf\n", double(now.first - c * mid));
      return 0;
    }
    if (c < m) r = mid;
    else
      l = mid;
  }
  pv now = solve(l);
  printf("%.12lf\n", double(now.first - now.second * l));
  return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 8004kb

input:

4 2
1 2 3 4

output:

6.191147129557

result:

ok found '6.191147130', expected '6.191147130', error '0.000000000'

Test #2:

score: 0
Accepted
time: 2ms
memory: 9984kb

input:

10 3
1 2 3 4 5 6 7 8 9 10

output:

22.591625366514

result:

ok found '22.591625367', expected '22.591625367', error '0.000000000'

Test #3:

score: 0
Accepted
time: 1ms
memory: 10112kb

input:

1 1
1

output:

1.000000000000

result:

ok found '1.000000000', expected '1.000000000', error '0.000000000'

Test #4:

score: 0
Accepted
time: 0ms
memory: 10060kb

input:

1 1
100000

output:

316.227766016838

result:

ok found '316.227766017', expected '316.227766017', error '0.000000000'

Test #5:

score: -100
Wrong Answer
time: 0ms
memory: 10172kb

input:

7 1
10 47 53 9 83 33 15

output:

41.833007812500

result:

wrong answer 1st numbers differ - expected: '41.8330013', found: '41.8330078', error = '0.0000002'