xs_siqi @ 2023-08-20 09:07:10
写了一个随机步长二分(((
测了好几发跑得都特别快,没写快输,甚至只比正常程序慢了两三倍的样子。。。
想问一下这个算法的复杂度大概是多少。。
#include<bits/stdc++.h>
#define WUDIAKIOI 666
using namespace std;
const int maxn=1e6+5;
const int DR[4]={1145,1919,233,WUDIAKIOI};
const int mod=1011451423;
int n,k,a[maxn];
int RF(int d){
int l=1,r=n,tms=0;
while(l<=r){
int rid=(l+r)>>1;
tms++;
if(tms>2000)return l;//避免运气太差的情况
if(a[rid]<d){
l=l+((rand()%1000)*(rand()%1000))%(rid-l+1)+1;}//因为步长最多是500000的,所以rand出来的东西开大一点
else{
r=r-((rand()%1000)*(rand()%1000))%(r-rid+1)-1;}}
return l;}
void read(int &x){
x=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while('0'<=ch&&ch<='9')x=x*10+ch-'0',ch=getchar();}
signed main(){
srand((int)time(NULL));
read(n),read(k);
for(int i=1;i<=n;i++)read(a[i]);
for(int x,i=1;i<=k;i++){
read(x);int p=RF(x);
if(a[p]!=x)printf("-1 ");
else printf("%d ",p);}
return 0;}
by xs_siqi @ 2023-08-20 17:34:32
@Wangxun 二分节点不在中间是什么意思,是指我的 mid 不一定是
by Wangxun @ 2023-08-20 17:37:07
@xs_siqi
是的,mid 在
打个比方说,
by xs_siqi @ 2023-08-20 17:59:47
为什么 但是我的 rid 不是已经定义成恰好两者之间的位置了吗,那不是就是说明要么
如果
by xs_siqi @ 2023-08-20 17:59:55
@Wangxun
by Wangxun @ 2023-08-20 19:10:40
@xs_siqi
submission
理论单次查询时间复杂度