QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#887672 | #9540. Double 11 | xjx2009 | WA | 0ms | 5980kb | C++14 | 2.2kb | 2025-02-07 19:04:02 | 2025-02-07 19:04:03 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000010;
const long double eps=1e-8;
ll n,m;
long double a[N];
long double f[N],num[N],ans;
struct node{
ll id,l,r;
}st[N];
ll top,ed;
long double w(ll l,ll r){
return sqrtl(1.0*(r-l)*(a[r]-a[l]));
}
ll get_front(){
ll id=st[ed].id;
st[ed].l++;
if(st[ed].l>st[ed].r) ed++;
return id;
}
long double query(node x,ll y){
return f[x.id]+w(x.id,y);
}
node nod(ll id,ll l,ll r){
node x;x.id=id;x.l=l;x.r=r;
return x;
}
void insert(node x){
// printf("%lld %.6lf %.6lf\n",st[top].r,query(x,st[top].r),query(st[top],st[top].r));
if(top>=ed&&query(x,st[top].r)>query(st[top],st[top].r)) return;
x.r=n;
while(top>=ed&&query(x,st[top].l)<query(st[top],st[top].l)) x.l=st[top].l,top--;
if(top<ed||query(x,st[top].r)>query(st[top],st[top].r)) {st[++top]=x;return;}
ll l=st[top].l,r=st[top].r;
while(l<r){
ll mid=(l+r)>>1;
if(query(x,mid)<query(st[top],mid)) r=mid;
else l=mid+1;
}
x.l=l;
st[top].r=l-1;
st[++top]=x;
}
ll solve(long double add){
// cout<<"--------------"<<endl;
// printf("%.10Lf\n",add);
ed=1;top=0;
st[++top]=nod(0,1,n);
for(int i=1;i<=n;i++){
ll id=get_front();
// cout<<i<<" "<<id<<endl;
f[i]=f[id]+w(id,i)+add;
num[i]=num[id]+1;
insert(nod(i,0,0));
}
// cout<<add<<" "<<num[n]<<" "<<f[n]<<" "<<f[n]-num[n]*add<<endl;
// if(num[n]==m){
ans=f[n]-num[n]*add;
// }
if(num[n]<=m) return 0;
else return 1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) a[i]+=a[i-1];
double l=0,r=1e9;
for(int i=1;i<=100;i++){
double mid=(l+r)/2;
// cout<<fixed<<setprecision(13)<<mid<<" "<<l<<" "<<r<<endl;
if(solve(mid)) l=mid;
else r=mid;
}
printf("%.12Lf",ans);
return 0;
}
/*
5 1
100000000000 1000000000000 10000000000000 10000000001 1000000
2.4494897427831780981972840747059
71466 9482 98728 78471 22915
2470 5999 53211 25994 3996
11349 30511 56448 17277 78308
18316 42069 38636 63127 26256
63985 57249 58305 64366 17839
28518 18980 95945 36316 6076
69530 96509 6940 6039 56048
41847 82118 41054 49670 95896
45891 74636 90736 75413 27251
87730 68344 66202 71879 23152
*/
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 5980kb
input:
4 2 1 2 3 4
output:
6.191147129557
result:
ok found '6.191147130', expected '6.191147130', error '0.000000000'
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 5976kb
input:
10 3 1 2 3 4 5 6 7 8 9 10
output:
22.532385382358
result:
wrong answer 1st numbers differ - expected: '22.5916254', found: '22.5323854', error = '0.0026222'