求证明复杂度
查看原帖
求证明复杂度
484446
HYXLE楼主2024/11/1 15:04

rt,感觉复杂度不对,但是跑的还挺快。

#include<bits/stdc++.h>
#define ll long long
#define R register
using namespace std;
const int N=1e5+5,M=1e7+5;
struct node{int l,r;}ans[N*100];
int n,q,pr[N];
inline bool check(int x,int lst){
	int mn=x;
	for(R int i=1;i<=n;++i){
		mn=min(mn,x-x%pr[i]);
		if(mn<lst)return 1;
	}
	return 0;
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(R int i=1;i<=n;++i){
		cin>>pr[i];
	}
	sort(pr+1,pr+n+1);
	n=unique(pr+1,pr+n+1)-pr-1;
	int tot=0;
	for(int l=1,res,r;l<=M-5;l=res+1){
		int ls=l;r=M-5;res=-1;
		while(ls<=r){
			int mid=ls+r>>1;
			if(check(mid,l))ls=mid+1,res=mid;
			else r=mid-1;
		}
		if(res==-1)break;
		ans[++tot]={l,res};
	}
	while(q--){
		int x;cin>>x;
		if(x==0)cout<<0<<'\n';
		else{
			int l=1,r=tot;
			if(ans[r].r<x){
				cout<<"oo\n";continue;
			}
			int res=tot;
			while(l<=r){
				int mid=l+r+1>>1;
				if(ans[mid].l<=x)res=mid,l=mid+1;
				else r=mid-1;
			}
			cout<<res<<'\n';
		}
	}
	return 0;
}
2024/11/1 15:04
加载中...