求助!不知道为什么TLE 。。。
查看原帖
求助!不知道为什么TLE 。。。
581928
jasonliujiahua楼主2023/9/17 16:46
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=4e5+10;
int t,n,m,q,k,a[maxn],ans,st[maxn][40],pre[maxn];
struct node
{
    int val,id;
}b[maxn];
bool operator < (node x,node y){return x.val>y.val;};
void init()
{
    ans=1e9;
    cin>>n>>q;
    for(int i=1;i<=n;i++) cin>>a[i],a[i+n]=a[i];
}
inline void ST()
{
    for(int i=1;i<=2*n;i++) st[i][0]=a[i];
    for(int j=1;(1ll<<j)<=2*n;j++)
    {
        for(int i=1;i+(1ll<<j)-1<=2*n;i++)
        {
            st[i][j]=st[i][j-1]|st[i+(1ll<<(j-1))][j-1];
        }
    }
}
inline int query(int x,int y)
{
    int z=log2(y-x+1);
    return st[x][z]|st[y-(1ll<<z)+1][z];
}
inline void binary(int i,int l,int r)
{
    if(l==r)
    {
        int num=query(i,i+l-1);
        if(b[m].val!=num && i+l-1!=n+1) b[++m]={num,(l-1-(i+l-1>n+1))*n+i};
        return;
    }
    int mid=(l+r)>>1;
    if(query(i,i+l-1)==b[m].val && query(i,i+r-1)==b[m].val) return;
    binary(i,l,mid);
    binary(i,mid+1,r);
}
void work()
{
    m=0;
    for(int i=1;i<=n;i++)
    {
        b[++m]={a[i],i};
        binary(i,2,n);
    }
    sort(b+1,b+m+1);
    pre[0]=1e18;
    for(int i=1;i<=m;i++) pre[i]=min(pre[i-1],b[i].id);
}
void answer()
{
    while(q--)
    {
        int x;
        cin>>x;
        if(b[1].val<=x) cout<<"-1\n";
        else
        {
            ans=lower_bound(b+1,b+m+1,(node){x,1000000})-b-1;
            cout<<pre[ans]<<endl;
        }
    }
}
signed main()
{
    cin>>t;
    while(t--)
    {
        init();
        ST();
        work();
        answer();
    }
    return 0;
}
2023/9/17 16:46
加载中...