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;
}