/ SeriousOJ /

Record Detail

Wrong Answer


  
# Status Time Cost Memory Cost
#1 Accepted 2ms 532.0 KiB
#2 Accepted 3ms 532.0 KiB
#3 Accepted 3ms 316.0 KiB
#4 Accepted 4ms 532.0 KiB
#5 Accepted 4ms 532.0 KiB
#6 Accepted 4ms 532.0 KiB
#7 Wrong Answer 4ms 532.0 KiB
#8 Wrong Answer 4ms 532.0 KiB

Code

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using dt = array<int, 2>;

template<typename T> struct SegmentTree {
  vector<T> st;
  vector<T>& a;
  T defaultValue = 0; 
  SegmentTree(vector<T>& arr) : a(arr) {
    st.resize(4 * arr.size());
    build(1, 0, arr.size() - 1);
  }
  T combine(T x, T y) {
    return max(x, y);
  }
  void build(int u, int s, int e) {
    if (s == e) {
      st[u] = a[s];
      return;
    }
    int v = 2 * u, w = (2 * u) + 1, m = (s + e) / 2;
    build(v, s, m);
    build(w, m + 1, e);
    st[u] = combine(st[v], st[w]);
  }
  T _query(int l, int r, int u, int s, int e) {
    if (e < l || r < s) return defaultValue;
    if (l <= s && e <= r) return st[u];
    int v = 2 * u, w = (2 * u) + 1, m = (s + e) / 2;
    T lc = _query(l, r, v, s, m);
    T rc = _query(l, r, w, m + 1, e);
    return combine( lc, rc);
  }
  void _update(int idx, T newV, int u, int s, int e) {
    if (s == e) {
      st[u] = a[s] = newV;
      return;
    }
    int v = 2 * u, w = (2 * u) + 1, m = (s + e) / 2;
    if (idx <= m) _update(idx, newV, v, s, m);
    else _update(idx, newV, w, m + 1, e);
    st[u] = combine(st[v], st[w]);
  }
  T query(int l, int r) {
    return _query(l, r, 1, 0, (int)a.size() - 1);
  }
  void update(int idx, T newV) {
    _update(idx, newV, 1, 0, (int)a.size() - 1);
  }
  // query(l, r);
  // update(idx, newV);
};


void test() {
  int n;
  cin >> n;

  vector<ll> a(n), b(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    a[i]--;
  }
  for (int i = 0; i < n; i++) {
    cin >> b[i];
  }

  ll mx = 0;
  vector<ll> v(n);
  SegmentTree<ll> seg(v);
  vector<ll> dp(n);
  for (int i = n - 1; i >= 0; i--) {
    dp[i] = b[i];
    if (a[i] + 1 < n) dp[i] += seg.query(a[i] + 1, n - 1);
    seg.update(a[i], dp[i]);
    mx = max(mx, dp[i]);
  }

  for (int i = n - 1; i >= 0; i--) {
    if (dp[i] == mx) {
        cout << n - i << "\n";
        return;
    }
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int T = 1;  
  cin >> T;
  for (int i = 1; i <= T; i++) {
    test();
  }
  return 0;
}

Information

Submit By
Type
Submission
Problem
P1224 Maximize the max
Language
C++17 (G++ 13.2.0)
Submit At
2025-09-03 20:18:41
Judged At
2025-09-03 20:18:41
Judged By
Score
6
Total Time
4ms
Peak Memory
532.0 KiB