QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#769886 | #9540. Double 11 | Tomorrow | WA | 1ms | 3872kb | C++17 | 2.8kb | 2024-11-21 19:45:56 | 2024-11-21 19:45:57 |
Judging History
answer
#include <bits/extc++.h>
using namespace std;
#define C const
#define SC static
#define CE constexpr
#define TL template
#define TN typename
#define OP operator
#define pb push_back
#define ft first
#define sd second
#define TTT TL<TN T = I>
#define BE(v) v.begin(), v.end()
#define VD void
#define I int
#define LL long long
#define STR string
using PII = pair<I, I>;
TTT using V = vector<T>;
#define FORX(v) for(auto& x : v)
#define FOR(i, b, e) for(I i = b, _e = e;i < _e; ++i)
#define FORR(i, b, e) for(I i = b, _e = e;i > _e; --i)
#define FUNC(T, f, ...) function<T(__VA_ARGS__)> f = [&](__VA_ARGS__)->T
TTT CE T inf() { return numeric_limits<T>::max() / 2; }
TTT VD setmin(T& a, C T& b) { if (b < a)a = b; }
TTT VD setmax(T& a, C T& b) { if (a < b)a = b; }
#define mi (l+(r-l)/2)
struct DQIM//DynamicQuadrilateralInequalityMinimum
{
I n, m = 0, t = 0;
V<PII> a{ {0,-1} };
function<bool(I, I, I)> cmp;//cmp(i,j,k) : returns true if for i, j is better than k
TTT DQIM(I n, T&& cmp) :n(n), cmp(cmp) {}
I query(I i) { return upper_bound(BE(a), PII(i, m))->sd; }
VD add()
{
while (t && cmp(a[t - 1].ft, m, a[t].sd))a.pop_back(), --t;
if (t && cmp(a[t].ft - 1, m, a[t].sd))
{
I l = a[t - 1].ft, r = n;
while (l + 1 < r)(!cmp(mi, m, a[t].sd) ? l : r) = mi;
a[t].ft = r; a.pb({ n,m }), ++t;
}
else if (a[t].ft < n)a.pb({ n,m }), ++t;
++m;
}
};
//CountLimitationBinarySearch
//f should be a function which receives a shift value and returns a pair {min_value, count}
//mxc: =1 means the count returned by f is maximized, =0 means minimized, useful only when S is integer type
//WARNING: [l,r) is the range of shift value, not the answer
TL<TN S, TN T, I mxc = 1> S clbs(C function<pair<S, T>(S)>& f, T c, S l, S r, S eps = 1)
{
while (l + eps < r)(f(mi).sd >= c ? l : r) = mi;
return f(mxc ? l : r).ft - (mxc ? l : r) * c;
}
using D = double;
VD test()
{
I n, m; cin >> n >> m;
V<LL> a(n + 1);
FOR(i, 1, n + 1)cin >> a[i];
sort(BE(a)); FOR(i, 1, n + 1)a[i] += a[i - 1];
using PDI = pair<D, I>;
FUNC(PDI, dp, D sv)
{
V<D> f(n + 1); V<I> c(n + 1);
FUNC(D, calc, I i, I j) { return sqrt((i - j) * (a[i] - a[j])); };
FUNC(bool, cmp, I i, I j, I k) { return f[j] + calc(i, j) < f[k] + calc(i, k); };
DQIM dq(n + 1, cmp); dq.add();
FOR(i, 1, n + 1)
{
I j = dq.query(i);
f[i] = f[j] + calc(i, j) + sv;
c[i] = c[j] + 1;
dq.add();
}
return { f[n],c[n] };
};
cout << fixed << setprecision(10) << clbs<D, I>(dp, m, -1e10, 1e10, 1e-12);
}
I main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
if (fopen("test.in", "r"))
{
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
}
I t = 1;
// cin >> t;
while (t--)test();
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3852kb
input:
4 2 1 2 3 4
output:
6.1911471296
result:
ok found '6.191147130', expected '6.191147130', error '0.000000000'
Test #2:
score: 0
Accepted
time: 1ms
memory: 3868kb
input:
10 3 1 2 3 4 5 6 7 8 9 10
output:
22.5916253665
result:
ok found '22.591625367', expected '22.591625367', error '0.000000000'
Test #3:
score: 0
Accepted
time: 0ms
memory: 3716kb
input:
1 1 1
output:
1.0000000000
result:
ok found '1.000000000', expected '1.000000000', error '0.000000000'
Test #4:
score: 0
Accepted
time: 0ms
memory: 3800kb
input:
1 1 100000
output:
316.2277660370
result:
ok found '316.227766037', expected '316.227766017', error '0.000000000'
Test #5:
score: -100
Wrong Answer
time: 0ms
memory: 3872kb
input:
7 1 10 47 53 9 83 33 15
output:
41.8330020905
result:
wrong answer 1st numbers differ - expected: '41.8330013', found: '41.8330021', error = '0.0000000'