QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#704700 | #9540. Double 11 | ucup-team4435# | WA | 4412ms | 4052kb | C++23 | 3.9kb | 2024-11-02 20:39:39 | 2024-11-02 20:39:46 |
Judging History
answer
#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;
const int LG = 20;
double start;
double getTime() {
return ((double) clock() - start) / CLOCKS_PER_SEC;
}
void solve() {
start = clock();
int n, m;
cin >> n >> m;
vector<ll> s(n);
for (auto &x : s) {
cin >> x;
}
sort(all(s));
vector<ll> psum(n + 1);
for (int i = 0; i < n; i++) {
psum[i + 1] = psum[i] + s[i];
}
auto solve = [&] (ld lambda) {
vector<pair<ld, int>> dp(n + 1, {INF, INFi});
dp[0] = {0, 0};
vector<pair<int, int>> stk;
stk.emplace_back(0, 0); // (from, who)
auto calc = [&] (int i, int j) {
auto val = dp[i];
val.first += sqrtl((psum[j] - psum[i]) * (j - i)) + lambda;
val.second++;
return val;
};
for(int i = 1; i <= n; ++i) {
{
int pos = lower_bound(all(stk), make_pair(i + 1, -1)) - stk.begin();
pos--;
dp[i] = calc(stk[pos].second, i);
}
int r = n + 1;
while (!stk.empty() && r > i + 1) {
auto [from, who] = stk.back();
if (from > i && calc(who, from) > calc(i, from)) {
r = from;
stk.pop_back();
continue;
}
int lq = max(from, i);
int rq = r;
while(rq - lq > 1) {
int mid = (lq + rq) / 2;
if (calc(who, mid) < calc(i, mid)) {
lq = mid;
} else {
rq = mid;
}
}
r = rq;
break;
}
if (r != n + 1) {
stk.emplace_back(r, i);
}
}
return dp[n];
};
ld L = -1e18;
ld R = 1e18;
while (getTime() < 5.5) {
ld M = (L + R) / 2;
if (solve(M).second > m) {
L = M;
} else {
R = M;
}
}
auto [val, k] = solve(L);
cout << val - m * L << '\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: 3782ms
memory: 4052kb
input:
4 2 1 2 3 4
output:
6.191147129557
result:
ok found '6.191147130', expected '6.191147130', error '0.000000000'
Test #2:
score: 0
Accepted
time: 4412ms
memory: 3920kb
input:
10 3 1 2 3 4 5 6 7 8 9 10
output:
22.591625366514
result:
ok found '22.591625367', expected '22.591625367', error '0.000000000'
Test #3:
score: 0
Accepted
time: 3057ms
memory: 3932kb
input:
1 1 1
output:
1.000000000000
result:
ok found '1.000000000', expected '1.000000000', error '0.000000000'
Test #4:
score: -100
Wrong Answer
time: 2928ms
memory: 3876kb
input:
1 1 100000
output:
316.250000000000
result:
wrong answer 1st numbers differ - expected: '316.2277660', found: '316.2500000', error = '0.0000703'