为什么这个都能过啊???
查看原帖
为什么这个都能过啊???
401088
xs_siqi楼主2023/8/20 09:07

写了一个随机步长二分(((

测了好几发跑得都特别快,没写快输,甚至只比正常程序慢了两三倍的样子。。。

想问一下这个算法的复杂度大概是多少。。

#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;}
2023/8/20 09:07
加载中...