社区讨论

求调 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 条回复,欢迎继续交流。

正在加载回复...