52pts求调
查看原帖
52pts求调
1285357
jinminghao楼主2025/7/2 20:17

rt.

有几个点too long,还有几个点输出的比答案大

求各位大佬帮忙ヾ(•ω•`)o

代码:

#include<cstdio>
#define max(a,b) (a>b?a:b)
using namespace std;
typedef long long LL;
const int N=1e5+10;
int c[N],n,T;
LL a[N],m;
int main(){
	scanf("%d",&T);
	while(T--){
		LL ans=0,cnt=0;
		scanf("%d%lld",&n,&m);
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
			c[i]=0;
			LL t1=m/a[i];
			LL t2=m/t1;
			if(a[i]>=max(t1,t2)){
				c[i]=0;
				ans+=a[i];
			}else if(t1>=t2){
				c[i]=1;
				ans+=t1;
			}else{
				c[i]=2;
				ans+=t2;
			}
		}
		for(int i=1;i<=n;i++){
			__int128 u=a[i];
			u*=u;
			if(u==m){
				if(c[i-1]==2) c[i]=2;
				else if(c[i-1]==1) c[i]=1;
			}
		}
		for(int i=n-1;i>=1;i--){
			__int128 u=a[i];
			u*=u;
			if(u==m){
				if(c[i+1]==2) c[i]=2;
				else if(c[i+1]==1&&c[i]==0) c[i]=1;
			}
		}
		for(int i=1;i<=n;i++){
			if(c[i]==0&&c[i-1]==2) c[i]=2;
		}
		for(int i=n-1;i>=1;i--){
			if(c[i]==0&&c[i+1]==2) c[i]=2;
		}
		for(int i=1;i<=n;i++){
			if(!c[i]) continue;
			if(!c[i-1]) cnt++; 
		}
		for(int i=1;i<=n;i++){
			if(c[i]<2) continue;
			if(c[i-1]<2) cnt++;
		}
		printf("%lld %lld\n",ans,cnt);
	}
	return 0;
}
2025/7/2 20:17
加载中...