Iva & Pav
题解,好多细节。。
1.构建st表时的细节
2.数越多,按位与的结果越小,所以对于 \(f(l,i)\) 存在 \(r_{max}\) 使得 \(i>r_{max}\) 时 \(f(l,i)<k\) 小于等于时相反,故具有单调性
但是,在倍增结构上二分你玩原神玩多了?
向右遍历即可,直到 \(r\) 恰好大于 \(r_{max}\)
code
#include<bits/stdc++.h>
using namespace std;
int a[200005]={0};
int st[200005][20]={0};
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
st[i][0]=a[i];
}
for(int k=1;k<=log2(n);k++)
for(int l=1;l+(1<<k)-1<=n;l++)
st[l][k]=st[l][k-1]&st[l+(1<<(k-1))][k-1];
int q;
cin>>q;
while(q--)
{
int l,k;
cin>>l>>k;
if(a[l]<k)
{
printf("-1 ");
continue;
}
int r=l,pre=a[l];
for(int i=log2(n-l+1);i>=0;i--)
{
if(r+(1<<i)-1<=n&&(pre&st[r][i])>=k)
{
pre&=st[r][i];
r+=(1<<i);
}
}
cout<<r-1<<" ";
}
puts("");
}
return 0;
}

浙公网安备 33010602011771号