QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#843501 | #9963. Express Rotations | ucup-team4435# | WA | 1ms | 3852kb | C++20 | 8.5kb | 2025-01-04 19:48:21 | 2025-01-04 19:48:21 |
Judging History
answer
#pragma GCC optimize("Ofast")
#include "bits/stdc++.h"
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rep1(i, n) for (int i = 1; i < (n); ++i)
#define rep1n(i, n) for (int i = 1; i <= (n); ++i)
#define repr(i, n) for (int i = (n) - 1; i >= 0; --i)
#define pb push_back
#define eb emplace_back
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define each(x, a) for (auto &x : a)
#define ar array
#define vec vector
#define range(i, n) rep(i, n)
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using str = string;
using pi = pair<int, int>;
using pl = pair<ll, ll>;
using vi = vector<int>;
using vl = vector<ll>;
using vpi = vector<pair<int, int>>;
using vvi = vector<vi>;
int Bit(int mask, int b) { return (mask >> b) & 1; }
template<class T>
bool ckmin(T &a, const T &b) {
if (b < a) {
a = b;
return true;
}
return false;
}
template<class T>
bool ckmax(T &a, const T &b) {
if (b > a) {
a = b;
return true;
}
return false;
}
// [l, r)
template<typename T, typename F>
T FindFirstTrue(T l, T r, const F &predicat) {
--l;
while (r - l > 1) {
T mid = l + (r - l) / 2;
if (predicat(mid)) {
r = mid;
} else {
l = mid;
}
}
return r;
}
template<typename T, typename F>
T FindLastFalse(T l, T r, const F &predicat) {
return FindFirstTrue(l, r, predicat) - 1;
}
const int INFi = 2e9;
const ll INF = 2e18;
struct fenwick {
int n{};
vector<ll> fenw{};
void build(int k) {
n = k;
fenw.resize(n);
}
void upd(int i, ll x) {
for (; i < n; i = i | (i + 1)) fenw[i] += x;
}
ll get(int i) {
ll res = 0;
for (; i >= 0; i = (i & (i + 1)) - 1) res += fenw[i];
return res;
}
ll get(int l, int r) {
if (l > r) return 0;
return get(r) - get(l - 1);
}
int lower_bound(ll x) {
int r = -1;
for(int j = 20; j >= 0; --j) {
int r2 = r + (int)(1 << j);
if (r2 < n && fenw[r2] < x) {
x -= fenw[r2];
r = r2;
}
}
return r + 1;
}
};
void solve() {
int n; cin >> n;
vl a(n);
rep(i, n) cin >> a[i];
fenwick f1, f2;
f1.build(n);
f2.build(n);
rep(i, n) {
f1.upd(i, a[i]);
f2.upd(i, a[i]);
}
vi ord(n);
iota(all(ord), 0);
sort(all(ord), [&] (const int &i, const int &j) { return make_pair(-a[i], i) < make_pair(-a[j], j); });
vector<pi> segs;
for(int l = 0, r = 0; l < n; l = r) {
while (r < n && a[ord[l]] == a[ord[r]]) r++;
segs.emplace_back(l, r);
}
vl dp(n, INF);
vi cur, prv;
{
auto [l, r] = segs[0];
for(int i = l; i < r; ++i) cur.push_back(ord[i]);
for(int i = 0; i < cur.size(); ++i) {
int pos = cur[i];
{
ll value = 0;
if (i > 0) {
value += (f1.get(cur[i - 1]) - 1ll * i * a[pos]) * 2;
}
value += f1.get(pos, n - 1);
ckmin(dp[pos], value);
}
{
ll value = 0;
if (i + 1 < cur.size()) {
value += f1.get(cur[i + 1], n - 1) * 2 - 1ll * ((int)cur.size() - i - 1) * a[pos];
}
value += f1.get(0, pos - 1);
value -= 1ll * i * a[pos];
ckmin(dp[pos], value);
}
}
for(auto &i : cur) {
f2.upd(i, -a[i]);
}
}
vector<pair<int, int>> common;
auto GetCommon = [&] () {
common.clear();
int i = 0;
int j = 0;
while (i < cur.size() && j < prv.size()) {
if (cur[i] < prv[j]) {
common.emplace_back(cur[i], 1);
i++;
} else {
common.emplace_back(prv[j], 0);
j++;
}
}
while (i < cur.size()) common.emplace_back(cur[i++], 1);
while (j < prv.size()) common.emplace_back(prv[j++], 0);
for(auto &pos : cur) {
f2.upd(pos, -a[pos]);
}
for(auto &pos : prv) {
f1.upd(pos, -a[pos]);
}
};
vi Next(n, n);
vi Prev(n, -1);
for(int g = 1; g < segs.size(); ++g) {
swap(prv, cur);
cur.clear();
{
auto [l, r] = segs[g];
for(int i = l; i < r; ++i) cur.push_back(ord[i]);
}
for(int i = 0; i + 1 < cur.size(); ++i) {
Next[cur[i]] = cur[i + 1];
Prev[cur[i + 1]] = cur[i];
}
GetCommon();
{
// ... x ... y| ... |Y ...
// ... x| ... |Y ...
ll min_value = INF;
ll val2 = INF;
for(auto &[i, tp] : common) {
if (tp == 0) {
ckmin(val2, dp[i] - f2.get(i) + f1.get(i));
ckmin(min_value, dp[i] + f1.get(i));
} else {
ckmin(dp[i], min_value + f1.get(i, n - 1));
min_value = val2 + f2.get(i);
}
}
}
{
// ... x ... Y| ...
ll min_value = INF;
for(auto &[i, tp] : common) {
if (tp == 0) {
ckmin(min_value, dp[i] + f1.get(i));
} else {
if (min_value != INF) {
ll value = min_value + f2.get(i);
if (Next[i] != n) {
int j = Next[i];
value += f1.get(j, n - 1) + f2.get(j, n - 1);
}
ckmin(dp[i], value);
}
}
}
// ..... x ..... Y| ....
int from = cur[0];
int to = cur[cur.size() - 1];
for(auto i : prv) {
if (i < from) {
ckmin(dp[to], dp[i] + f2.get(i, to));
} else if (i < to) {
ckmin(dp[to], dp[i] + f1.get(from, i) + f2.get(from, to));
}
}
}
{
// ... Y| ... x ....
// ... Y| .. y .. x ....
ll min_value = INF;
ll val2 = INF;
for(int ptr = (int)common.size() - 1; ptr >= 0; --ptr) {
auto [i, tp] = common[ptr];
if (tp == 0) {
// [y, ..., x]
ckmin(val2, dp[i] + f1.get(i));
ckmin(min_value, dp[i] + f2.get(i, n - 1));
} else {
ckmin(dp[i], min_value + f2.get(0, i));
min_value = val2 + f2.get(i, n - 1) - f1.get(i - 1);
}
}
}
{
// . y .. |Y ... x ...
ll min_value = INF;
for(int ptr = (int)common.size() - 1; ptr >= 0; --ptr) {
auto [i, tp] = common[ptr];
if (tp == 0) {
ckmin(min_value, dp[i] + f2.get(i, n - 1) * 2 + f1.get(i));
} else {
if (min_value != INF) {
ll value = min_value - f1.get(i - 1);
if (Prev[i] != -1) {
int j = Prev[i];
value += f2.get(j) * 2;
}
ckmin(dp[i], value);
}
}
}
// ... |Y ...... x ...
int to = cur[0];
int from = cur[cur.size() - 1];
for(auto i : prv) {
if (i > from) {
ckmin(dp[to], dp[i] + f1.get(to, i));
} else if (i > to) {
ckmin(dp[to], dp[i] + f2.get(i, from) * 2 + f1.get(to, i));
}
}
}
// for(auto &x : dp) cerr << x << ' ';
// cerr << '\n';
}
ll ans = INF;
for(auto &i : cur) {
ckmin(ans, dp[i]);
}
cout << ans << '\n';
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout << setprecision(12) << fixed;
int t = 1;
// cin >> t;
rep(i, t) {
solve();
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3512kb
input:
6 6 10 6 5 4 5
output:
16
result:
ok 1 number(s): "16"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3664kb
input:
1 525434
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3520kb
input:
20 724315 660084 703741 660084 33388 703741 724315 608476 703741 33388 660084 33388 703741 703741 724315 33388 660084 703741 703741 33388
output:
10450373
result:
ok 1 number(s): "10450373"
Test #4:
score: 0
Accepted
time: 1ms
memory: 3624kb
input:
1000 205212 781871 811133 847754 365647 686203 781871 811133 205212 811133 365647 553550 205212 365647 811133 205212 205212 781871 875225 781871 365647 344701 205212 875225 365647 365647 811133 781871 875225 811133 781871 365647 553550 686203 365647 79214 553550 686203 781871 781871 875225 811133 20...
output:
1703022119
result:
ok 1 number(s): "1703022119"
Test #5:
score: -100
Wrong Answer
time: 0ms
memory: 3852kb
input:
1000 301641 35540 535041 598876 422289 932926 891853 928749 403425 515013 323155 468767 875308 397761 252409 674812 40987 889920 172600 98116 799381 718712 739731 228116 729441 314232 916892 391198 205018 977734 406583 970126 527675 752117 616274 614112 241590 226939 726732 976461 657267 705600 9482...
output:
40505654224
result:
wrong answer 1st numbers differ - expected: '40529669812', found: '40505654224'