Submission #709303

# Submission time Handle Problem Language Result Execution time Memory
709303 2023-03-13T10:40:54 Z awu Discharging (NOI20_discharging) C++14
9 / 100
1000 ms 235104 KB
#include <bits/extc++.h>
using namespace std;

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")

#define int long long
#define f first
#define s second
#define all(x) x.begin(), x.end()
#define debug(x) do{auto y = x; cout << #x << " = " << y << endl;}while(0)
// #define endl "\n"
#define unordered_map __gnu_pbds::gp_hash_table
using pii = pair<int, int>;

const int inf = 1ll << 30;
const int MOD = 1e9 + 7;

int fastlog2(int x) {
  return 63 - __builtin_clzll(x);
}

struct sparsetable {
  vector<vector<int>> t;
  sparsetable() {}
  sparsetable(vector<int>& a) {
    int n = a.size();
    t.resize(fastlog2(n) + 1, vector<int>(n));
    t[0] = a;
    for(int i = 1; i <= fastlog2(n); i++) {
      for(int j = 0; j + (1 << i) <= n; j++) {
        t[i][j] = max(t[i - 1][j], t[i - 1][j + (1 << (i - 1))]);
      }
    }
  }
  int query(int ql, int qr) {
    int lg = fastlog2(qr - ql);
    return max(t[lg][ql], t[lg][qr - (1 << lg)]);
  }
};
int n;
sparsetable st;

int eval(pii f, int x) {
  if(x >= f.f) return inf - x;
  return (n - x) * st.query(x, f.f) + f.s;
}

struct lichao {
  int tl, tr;
  pii f;
  lichao *lc, *rc;
  void insert(pii f2) {
    int tm = (tl + tr) / 2;
    if(eval(f2, tm) < eval(f, tm)) swap(f, f2);
    if(tl + 1 == tr) return;
    if(eval(f2, tl) <= eval(f, tl)) {
      if(!lc) {
        lc = new lichao{tl, tm, f2};
      } else {
        lc->insert(f2);
      }
    }
    if(eval(f2, tr - 1) <= eval(f, tr - 1)) {
      if(!rc) {
        rc = new lichao{tm, tr, f2};
      } else {
        rc->insert(f2);
      }
    }
  }
  int query(int x) {
    int tm = (tl + tr) / 2;
    int res = eval(f, x);
    if(x < tm && lc) return min(res, lc->query(x));
    if(x >= tm && rc) return min(res, rc->query(x));
    return res;
  }
};

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  vector<int> t(n);
  for(int i = 0; i < n; i++) {
    cin >> t[i];
  }
  st = sparsetable(t);
  vector<int> dp(n);
  lichao lct{0, n, {n, 0}};
  for(int i = n - 1; i >= 0; i--) {
    dp[i] = lct.query(i);
    lct.insert({i, dp[i]});
  }
  cout << dp[0] << endl;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 596 KB Output is correct
2 Incorrect 16 ms 588 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 596 KB Output is correct
2 Incorrect 16 ms 588 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 1086 ms 235104 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 10 ms 596 KB Output is correct
16 Incorrect 16 ms 588 KB Output isn't correct
17 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 10 ms 596 KB Output is correct
16 Incorrect 16 ms 588 KB Output isn't correct
17 Halted 0 ms 0 KB -