社区讨论
求调 ABC F
学术版参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lqi4zptk
- 此快照首次捕获于
- 2023/12/23 22:09 2 年前
- 此快照最后确认于
- 2023/12/24 09:31 2 年前
rt,WA 了 7 个点
CPP#include <bits/stdc++.h>
using namespace std;
inline int read(){
int x=0;bool f=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=0;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return f?x:-x;
}
long double f[200005],sum[200005];
int n,k,sx,sy,x[200005],y[200005],q[200005],head=1,tail;
inline long double dis(int p){
return sqrtl(1ll*(x[p]-sx)*(x[p]-sx)+1ll*(y[p]-sy)*(y[p]-sy));
}
inline long double d2(int p,int pp){
return sqrtl(1ll*(x[p]-x[pp])*(x[p]-x[pp])+1ll*(y[p]-y[pp])*(y[p]-y[pp]));
}
int main(){
// cout<<sqrtl(18)<<'\n';
n=read(),k=read(),sx=read(),sy=read();
x[0]=sx,y[0]=sy;
for(int i=1;i<=n;i++)
x[i]=read(),y[i]=read(),sum[i]=sum[i-1]+d2(i-1,i);
// cout<<d2(1,2)<<endl;
for(int i=1;i<=n;i++){
while(head<=tail&&q[head]<i-k) head++;
if(i<=k) f[i]=sum[i];
else f[i]=sum[i]-sum[q[head]]+f[q[head]]+dis(q[head])+dis(q[head]+1)-d2(q[head],q[head]+1);
while(head<=tail&&dis(i)+dis(i+1)-d2(i,i+1)<dis(q[tail])+
dis(q[tail]+1)-d2(q[tail],q[tail]+1)) tail--;
q[++tail]=i;
}
cout<<fixed<<setprecision(8)<<f[n]+d2(n,0)<<'\n';
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...