QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#725293#9540. Double 11zhoukangyang#WA 19ms15440kbC++142.0kb2024-11-08 17:00:422024-11-08 17:00:42

Judging History

你现在查看的是最新测评结果

  • [2024-11-08 17:00:42]
  • 评测
  • 测评结果:WA
  • 用时:19ms
  • 内存:15440kb
  • [2024-11-08 17:00:42]
  • 提交

answer

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define sz(a) ((int) (a).size())
#define ll long long 
#define vi vectoe<int>
#define pb emplace_back
#define me(a, x) memset(a, x, sizeof(a))
// #define double long double
using namespace std;
const int N = 1 << 19, mod = 1e8 + 7;
int n, m;
int a[N];

pair<double,int> dp[N];
ll pre[N];
double tmp;
pair<double,int>calc(int l, int r) {
	return make_pair(dp[l].first + sqrt((pre[r] - pre[l]) * (r - l)) + tmp, dp[l].second + 1);
}
int getwz(int x, int y) {
	int l = 1, r = n, ans = n + 1;
	while(l <= r) {
		int mid = (l + r) >> 1;
		if(calc(x, mid) >= calc(y, mid)) ans = mid, r = mid - 1;
		else l = mid + 1;
	}
	return ans;
}
double sval(int l, int r) {
	return sqrt((pre[r] - pre[l]) * (r - l));
}

int head, tail, q[N], las[N];
pair<double,int>check(double v) {
	tmp = v;
	L(i, 1, n) dp[i] = make_pair(1e18, 0);
	dp[0] = make_pair(0, 0);
	L(i, 1, n) {
		pre[i] = pre[i - 1] + a[i];
	}
	head = tail = 1, q[tail] = 0, las[tail] = n + 1; // [las[i - 1], las[i])
	// L(i, 0, n) {
	// 	L(j, i + 1, n) {
	// 		dp[j] = min(dp[j], calc(i, j));
	// 	}
	// }
	L(i, 1, n) {
		while(head < tail && las[head] <= i) ++head;
		dp[i] = calc(q[head], i);
		while(head < tail && getwz(q[tail], i) <= las[tail - 1]) --tail;
		las[tail] = getwz(q[tail], i), q[++tail] = i, las[tail] = n + 1;
	}
	me(las, 0);
	me(pre, 0);
	me(q, 0);
	return dp[n];
}
int main() {
	ios :: sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	L(i, 1, n) {
		cin >> a[i];
	}
	sort(a + 1, a + n + 1);
	double l = 0, r = 1e9, ans = 0;
	R(t, 60, 0) {
		double mid = (l + r) / 2;
		auto val = check(mid);
		ans = max(ans, val.first - mid * m);
		// cout << mid << " : " << val.first << ' ' << val.second << ' ' << mid * m << endl;
		if(val.second < m) {
			r = mid;
		} else {
			l = mid;
		}
	}
	cout.precision(12); cout << fixed;
	cout << ans << '\n';
	// cout << sqrt(3 * 2) + sqrt(7. * 2) << endl;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 19ms
memory: 14784kb

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: 15ms
memory: 15168kb

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: 19ms
memory: 15440kb

input:

1 1
1

output:

1.000000000000

result:

ok found '1.000000000', expected '1.000000000', error '0.000000000'

Test #4:

score: 0
Accepted
time: 15ms
memory: 15368kb

input:

1 1
100000

output:

316.227766036987

result:

ok found '316.227766037', expected '316.227766017', error '0.000000000'

Test #5:

score: -100
Wrong Answer
time: 15ms
memory: 15240kb

input:

7 1
10 47 53 9 83 33 15

output:

41.833001375198

result:

wrong answer 1st numbers differ - expected: '41.8330013', found: '41.8330014', error = '0.0000000'