求助,TLE15
查看原帖
求助,TLE15
723888
hansang楼主2024/6/6 09:18

按题解打的,但跑的特别慢

#include<bits/stdc++.h>
using namespace std;
#define pb emplace_back
const int N=4e5+10, LN=25;
int f[LN][N], a[N], b[N], n; bool v[N]; vector<int> di[N];
inline int calc(int l, int r){
    if(l>r) return -1;
    int D=log2(r-l+1);
    return f[D][l]&f[D][r-(1<<D)+1];
}
inline int query(int x, int y){
    if(x>y) swap(x, y);
    return calc(1, x-1)&calc(x+1, y-1)&calc(y+1, n);
}
inline int gcd(int x, int y){
    if(x==0) return y;
    else return gcd(y%x, x);
}
inline void init(){
    for(int i=1; i<=N-10; i++)
        for(int j=i; j<=N-10; j+=i)
            di[j].pb(i);
}
int main(){
    //freopen("a.in", "r", stdin);
    int T; scanf("%d", &T); init();
    while(T--){
        int x, ma=0; scanf("%d%d", &n, &x);
        for(int i=1; i<=n; i++){
            scanf("%d", &a[i]);
            ma=max(ma, a[i]);
            f[0][i]=a[i];
        }
        for(int i=1; i<=ma; i++) b[i]=0;
        for(int i=1; i<=n; i++) v[i]=0;

        for(int j=1; (1<<j)<=n; j++)
            for(int i=1; i<=n-(1<<j)+1; i++)
                f[j][i]=f[j-1][i]&f[j-1][i+(1<<(j-1))];
        vector<int> S; bool flag=0;
        for(int i=0; i<=20; i++){
            vector<int> V;
            for(int j=1; j<=n; j++)
                if((~a[j])&(1<<i)) V.pb(j);
            if(V.size()<=2){
                for(int j: V) S.pb(j), v[j]=1;
            }
        }

        for(int i=1; i<=n; i++) if(!v[i])
            for(int j: di[a[i]]) b[j]++;
        for(int i=ma; i>=1; i--) if(b[i]>=2){
            vector<int> V;
            for(int j=1; j<=n && (V.size()<2); j++)
                if(a[j]%i==0 && !v[j]) V.pb(j);
            int d=gcd(a[V[0]], a[V[1]]), tt=query(V[0], V[1]);
            if(d>tt+x){
                printf("YES\n2 %d %d\n%d ", a[V[0]], a[V[1]], n-2);
                for(int j=1; j<=n; j++) if(j!=V[0] && j!=V[1])
                    printf("%d ", a[j]);
                printf("\n");
                flag=1; break;
            }
        }

        if(!flag){
            sort(S.begin(), S.end()); S.erase(unique(S.begin(), S.end()), S.end());
            for(int i: S){
                for(int j=1; j<=n; j++) if(i!=j){
                    int d=gcd(a[i], a[j]), tt=query(i, j);
                    if(d>tt+x){
                        printf("YES\n2 %d %d\n%d ", a[i], a[j], n-2);
                        for(int k=1; k<=n; k++) if(k!=i && k!=j)
                            printf("%d ", a[k]);
                        printf("\n");
                        flag=1; break;
                    }
                }
                if(flag) break;
            }
        }
        if(!flag) printf("NO\n");
    }
    return 0;
}
2024/6/6 09:18
加载中...