求调 ABC F
  • 板块学术版
  • 楼主diqiuyi奶龙
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/12/23 22:08
  • 上次更新2023/12/24 09:31:36
查看原帖
求调 ABC F
324666
diqiuyi奶龙楼主2023/12/23 22:08

rt,WA 了 7 个点

#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;
}
2023/12/23 22:08
加载中...