为什么会TLE?
查看原帖
为什么会TLE?
662425
Ivan422楼主2024/4/18 18:43

这题和P7009一模一样,可是我同样的代码在这里超时了,而P7009的代码只跑了2.43s,求条。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10,M=105;
int n,m,a[N],LOG[N],st[N][M],ans; 
int ggcd(int x,int y){
    int c=x%y;
    while(y!=0){c=x%y;x=y;y=c;}
    return x;
}
int st_q(int l,int r){
    int k=LOG[r-l+1];
    int gcd=ggcd(st[l][k],st[r-(1<<k)+1][k]);
    return gcd;
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)st[i][0]=a[i];
    for(int k=1;k<=LOG[n];k++){
        int len=1<<k;
        for(int i=1;i<=n-len+1;i++){
            st[i][k]=ggcd(st[i][k-1],st[i+(1<<k-1)][k-1]);
        }
    }
    ans=0;
    for(int i=1;i<=n;i++){
        int x=i;
        while(x<=n){
            int l=x,r=n+1,mid;
            while(l+1<r){
                mid=(l+r)/2;
                if(st_q(i,mid)==st_q(i,x))l=mid;
                else r=mid;
            }
            ans=max(ans,st_q(i,x)*(l-i+1));
            x=l+1;
        }
    }
    cout<<ans<<endl;
    return;
}
signed main(){
    LOG[0]=-1;
    for(int i=1;i<=N;i++)LOG[i]=LOG[i>>1]+1;
    int t;cin>>t;
    while(t--)solve();
    return 0;
}

复杂度应该是 O(tnlog⁡n)O(tn\log n) 的。

2024/4/18 18:43
加载中...