結果
| 問題 | 
                            No.2009 Drunkers' Contest
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2022-07-15 23:11:59 | 
| 言語 | Text  (cat 8.3)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,751 bytes | 
| コンパイル時間 | 39 ms | 
| コンパイル使用メモリ | 6,816 KB | 
| 実行使用メモリ | 6,948 KB | 
| 最終ジャッジ日時 | 2024-06-27 20:29:46 | 
| 合計ジャッジ時間 | 2,561 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | WA * 4 | 
| other | WA * 54 | 
ソースコード
// 嘘を実装してました 逃亡
#include "template/template.hpp"
//
#include "segment-tree/lazy-segment-tree.hpp"
using namespace Nyaan;
struct D {
  double a, b, c;
  D() : a(0), b(0), c(0) {}
  D(double _a, double _b, double _c) : a(_a), b(_b), c(_c) {}
  double eval(double x) { return a / x + b * x + c; }
};
struct E {
  int f;
  double a, b, c;
  E() : f(-1), a(0), b(0), c(0) {}
  E(int _f, double _a, double _b, double _c) : f(_f), a(_a), b(_b), c(_c) {}
  bool operator==(const E& rhs) { return f == rhs.f; }
};
// range add range update
// 二分探索は手元でやる
void q() {
  auto f = [&](D a, D) -> D { return a; };
  auto g = [&](D a, E b) -> D {
    if (b.f == -1) return a;
    if (b.f == 1) {
      a.a += b.a, a.b += b.b, a.c += b.c;
      return a;
    }
    if (b.f == 2) {
      a.a = b.a, a.b = b.b, a.c = b.c;
      return a;
    }
    exit(1);
  };
  auto h = [&](E a, E b) -> E {
    if (b.f == -1) return a;
    if (b.f == 1) {
      if (a.f == -1) return b;
      a.a += b.a, a.b += b.b, a.c += b.c;
      return a;
    }
    if (b.f == 2) {
      return b;
    }
    exit(1);
  };
  D ti{};
  E ei{};
  inl(N);
  vl A(N), B(N);
  in(A, B);
  V<pair<double, int>> p;
  p.emplace_back(1, -1);
  rep(i, N) p.emplace_back(sqrt(A[i] / B[i]), i);
  sort(all(p));
  vi inv(N, -1);
  int th = -1;
  rep(i, sz(p)) {
    if (p[i].se != -1) inv[p[i].se] = i;
    if (p[i].se == -1) th = p[i].se;
  }
  trc(p);
  V<D> init(sz(p));
  LazySegmentTree seg(init, f, g, h, ti, ei);
  repr(i, N) {
    {
      int f = 1;
      double a = A[i];
      double b = B[i];
      double c = 0;
      seg.update(0, sz(p), E{f, a, b, c});
    }
    int L = -1, R = sz(p);
    while (L + 2 < R) {
      int i1 = (L + L + R) / 3;
      int i2 = (L + R + R) / 3;
      double x1 = p[i1].fi;
      double x2 = p[i2].fi;
      double y1 = seg.get_val(i1).eval(x1);
      double y2 = seg.get_val(i2).eval(x2);
      if (y1 < y2) {
        R = i2;
      } else {
        L = i1;
      }
    }
    int key = (L + R) / 2;
    double x = p[key].fi;
    D data = seg.get_val(key);
    double val = data.eval(x);
    seg.update(0, key + 1, E{2, 0., 0., val});
  }
  {
    int L = th - 1, R = sz(p);
    while (L + 2 < R) {
      int i1 = (L + L + R) / 3;
      int i2 = (L + R + R) / 3;
      double x1 = p[i1].fi;
      double x2 = p[i2].fi;
      double y1 = seg.get_val(i1).eval(x1);
      double y2 = seg.get_val(i2).eval(x2);
      if (y1 < y2) {
        R = i2;
      } else {
        L = i1;
      }
    }
    int key = (L + R) / 2;
    double x = p[key].fi;
    D data = seg.get_val(key);
    double val = data.eval(x);
    trc(key, x, val);
    out(val);
  }
}
void Nyaan::solve() {
  int T = 1;
  // in(T);
  while (T--) q();
}