답안 #1071693

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1071693 2024-08-23T10:06:06 Z quanquai Building Bridges (CEOI17_building) C++17
0 / 100
43 ms 3676 KB
/**
 *  author: anonymouse
 *  created: 23.08.2024 15:52:54
**/
#include <bits/stdc++.h>
#define int long long
using namespace std;

struct Line {
  long long a, b;
  Line() : a(0), b(0) {}
  Line(long long _a, long long _b) : a(_a), b(_b) {}
  long long eval(long long x) {
    return a * x + b;
  }
};
struct LiChaoTree {
  int l, r, mid;
  Line func;
  LiChaoTree* left = NULL;
  LiChaoTree* right = NULL;
  LiChaoTree(int _l, int _r) {
    l = _l;
    r = _r;
    mid = (l + r) / 2;
    func = {0, (long long) 1e18};
  } 
  void extend(int t, int _lo, int _hi) {    
    if (t == 0) {
      if (left != NULL) return;
      left = new LiChaoTree(_lo, _hi);
    } else {
      if (right != NULL) return;
      right = new LiChaoTree(_lo, _hi);
    }    
  }
  void ins(Line candidate) {
    if (candidate.eval(mid) < func.eval(mid)) swap(candidate, func);
    if (l + 1 == r) return;
    if (candidate.eval(l) < func.eval(l)) {
      extend(0, l, mid);
      left->ins(candidate);            
    } else {
      extend(1, mid, r);
      right->ins(candidate);
    }
  }
  int64_t get(int x) {
    int64_t ans = func.eval(x);
    if (l + 1 == r) return ans;
    if (x < mid) {
      if (left == NULL) return ans;
      ans = min(ans, left->get(x));
    } else {
      if (right == NULL) return ans;
      ans = min(ans, right->get(x));
    }
    return ans;
  }
};

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  
  int n; cin >> n;
  vector<long long> h(n), w(n);
  for (int i = 0; i < n; i++) {
    cin >> h[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> w[i];
  }
  LiChaoTree* tree = new LiChaoTree(0, (int) 1e9);
  vector<long long> dp(n);
  dp[0] = -w[0];
  tree->ins(Line((long long) -2 * h[0], h[0] * h[0]));
  for (int i = 1; i < n; i++) {
    dp[i] = tree->get(h[i]) + h[i] * h[i] - w[i];
    tree->ins(Line((long long) -2 * h[i], dp[i] + h[i] * h[i]));
  }  
  cout << accumulate(w.begin(), w.end(), 0ll) + dp[n - 1];

  return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 43 ms 3676 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -