Submission #50632807


Source Code Expand

#include <stdio.h>

void eval_segt (double *t, double *lazy, int k, int l, int r, double *acc_w) {
  if (lazy[k] != 0.0) {
    t[k] += lazy[k]*(acc_w[r]-acc_w[l]);
    if (r-l > 1) {
      lazy[2*k+1] += lazy[k];
      lazy[2*k+2] += lazy[k];
    }
  }
  lazy[k] = 0.0;
  return;
}

void add_segt_rec (double *t, double *lazy, int a, int b, double val, int k, int l, int r, double *acc_w) {
  eval_segt(t, lazy, k, l, r, acc_w);
  if (r <= a || b <= l) {
    return;
  }
  if (a <= l && r <= b) {
    lazy[k] = val;
    eval_segt(t, lazy, k, l, r, acc_w);
    return;
  }
  add_segt_rec(t, lazy, a, b, val, 2*k+1, l, (l+r)/2, acc_w);
  add_segt_rec(t, lazy, a, b, val, 2*k+2, (l+r)/2, r, acc_w);
  t[k] = t[2*k+1]+t[2*k+2];
  return;
}

void add_segt (double *t, double *lazy, int a, int b, double val, int size, double *acc_w) {
  add_segt_rec(t, lazy, a, b, val, 0, 0, size, acc_w);
  return;
}

double sum_segt_rec (double *t, double *lazy, int a, int b, int k, int l, int r, double *acc_w) {
  double ans = 0.0;
  eval_segt(t, lazy, k, l, r, acc_w);
  if (r <= a || b <= l) {
    return 0.0;
  }
  if (a <= l && r <= b) {
    return t[k];
  }
  ans += sum_segt_rec(t, lazy, a, b, 2*k+1, l, (l+r)/2, acc_w);
  ans += sum_segt_rec(t, lazy, a, b, 2*k+2, (l+r)/2, r, acc_w);
  return ans;
}

double sum_segt (double *t, double *lazy, int a, int b, int size, double *acc_w) {
  return sum_segt_rec(t, lazy, a, b, 0, 0, size, acc_w);
}

int main () {
  int n = 0;
  int l = 0;
  int d = 0;
  
  int res = 0;
  
  double ans = 0.0;
  double over = 0.0;
  
  double pd[400001] = {};
  double acc_pd[400001] = {};
  double acc_w[1048576] = {};
  double over_pd = 0.0;
  
  double t[1048575] = {};
  double lazy[1048575] = {};
  int size = 1;
  
  double pp[400001] = {};
  
  res = scanf("%d", &n);
  res = scanf("%d", &l);
  res = scanf("%d", &d);
  
  pd[0] = 1.0;
  pd[1] = -1.0;
  for (int i = 0; i < l; i++) {
    pd[i+1] += ((double)(d+1))*pd[i]/((double)d);
    pd[i+d+1] -= pd[i]/((double)d);
    if (i+d > n) {
      over_pd += pd[i]*((double)(i+d-n))/((double)d);
    }
  }
  for (int i = l; i < l+d; i++) {
    pd[i+1] += pd[i];
    acc_pd[i+1] = acc_pd[i]+pd[i];
  }
  for (int i = l+d; i < n+d; i++) {
    acc_pd[i+1] = acc_pd[i];
  }
  
  for (int i = l+1; i <= n; i++) {
    acc_w[i+1] = acc_w[i];
    acc_w[i+1] += acc_pd[i];
  }
  
  while (size <= n+d) {
    size <<= 1;
  }
  
  pp[0] = 1.0;
  pp[1] = -1.0;
  add_segt(t, lazy, 0, 1, 1.0, size, acc_w);
  ans = over_pd;
  for (int i = 0; i <= n; i++) {
    double tmp = sum_segt(t, lazy, i, n+1, size, acc_w);
    tmp += over_pd*(1.0-over);
    if (tmp > ans) {
      ans = tmp;
    }
    pp[i+1] += ((double)(d+1))*pp[i]/((double)d);
    pp[i+d+1] -= pp[i]/((double)d);
    add_segt(t, lazy, i+1, i+d+1, pp[i]/((double)d), size, acc_w);
    if (i+d > n) {
      over += pp[i]*((double)(i+d-n))/((double)d);
    }
  }
  
  printf("%.16lf\n", ans);
  return 0;
}

Submission Info

Submission Time
Task F - Black Jack
User chro4896
Language C (gcc 12.2.0)
Score 550
Code Size 3049 Byte
Status AC
Exec Time 227 ms
Memory 35668 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 550 / 550
Status
AC × 2
AC × 22
Set Name Test Cases
Sample 00_sample_01.txt, 00_sample_02.txt
All 00_sample_01.txt, 00_sample_02.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt
Case Name Status Exec Time Memory
00_sample_01.txt AC 14 ms 35636 KiB
00_sample_02.txt AC 187 ms 35576 KiB
01_test_01.txt AC 128 ms 35556 KiB
01_test_02.txt AC 129 ms 35656 KiB
01_test_03.txt AC 94 ms 35556 KiB
01_test_04.txt AC 15 ms 35580 KiB
01_test_05.txt AC 53 ms 35596 KiB
01_test_06.txt AC 159 ms 35664 KiB
01_test_07.txt AC 107 ms 35648 KiB
01_test_08.txt AC 44 ms 35660 KiB
01_test_09.txt AC 140 ms 35572 KiB
01_test_10.txt AC 97 ms 35652 KiB
01_test_11.txt AC 182 ms 35664 KiB
01_test_12.txt AC 160 ms 35608 KiB
01_test_13.txt AC 165 ms 35560 KiB
01_test_14.txt AC 192 ms 35504 KiB
01_test_15.txt AC 176 ms 35560 KiB
01_test_16.txt AC 188 ms 35624 KiB
01_test_17.txt AC 188 ms 35652 KiB
01_test_18.txt AC 186 ms 35580 KiB
01_test_19.txt AC 227 ms 35668 KiB
01_test_20.txt AC 188 ms 35644 KiB