下次再改
  • 板块灌水区
  • 楼主cheSs746
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/8/7 14:44
  • 上次更新2024/8/7 15:37:23
查看原帖
下次再改
1305109
cheSs746楼主2024/8/7 14:44
#include<bits/stdc++.h>
using namespace std;
long long ans,k,t,n,m,h,b[200005],a[200005],yy;
int check(int x) {
	int h=1;
	while (h*h<x) h=h+2;
	return h;
}
int ll(int x) {
	int h=1;
	while (h*h<x) h=h+2;
	h=h-2;
	if (x>=h*h+1&&x<=h*h+h+1) return x-(h*4-3);
	if (x>=h*h+h+2&&x<=h*h+2*h+2) return x-(h*4-1);
	if (x>=h*h+2*h+3&&x<=h*h+3*h+3) return x-(h*4+1);
	if (x>=h*h+3*h+4&&x<=h*h+4*h+4) return x-(h*4+3);
}
int main(){
	scanf("%lld%lld",&n,&m);
	for (int i=1;i<=m;i++) scanf("%lld",&a[i]);
	m++;
	a[m]=1;
	sort(a+1,a+m+1);
	for (int i=2;i<=m;i++) {
		t=i-1;
		b[i]=a[i];
		yy=check(a[i]);
		while (yy==check(a[t])&&t>0) {
			b[i]=min(b[i],b[t]+a[i]-a[t]+1);
			t--;
		}
		int hh=t;		
		yy=check(a[hh]);
		if (hh>0) while (yy==check(a[t])&&t>0) {
			b[i]=min(b[i],b[t]+min(abs(ll(a[i])-a[t])+1,abs(a[i]-a[t])));
			t--;
		}
		yy=check(a[i]);
		if (a[i]==yy*yy&&a[t]==(yy-2)*(yy-2)) b[i]=min(b[i],b[t]+2); 
	}
	if (a[m]==n) {
		printf("%lld",ans);
		return 0;
	}
	t=m;
	ans=n;
	yy=check(a[m]);
	while (yy==check(a[t])&&t>0) {
		ans=min(ans,b[t]+n-a[t]);
		t--;
	}
	yy=check(a[t]);
	while (yy==check(a[t])&&t>0) {
		ans=min(ans,b[t]+n-a[t]);
		t--;
	}
	yy=check(a[m]);
	if (a[m]==yy&&a[m]==(yy-2)^2) b[m]=min(b[m],b[t]+2); 
	for (int i=1;i<=m;i++) cout<<a[i]<<" "<<b[i]<<endl;
	
	printf("%lld",ans);
}
2024/8/7 14:44
加载中...