第一个点wa求解(雾)
查看原帖
第一个点wa求解(雾)
222104
_yjh楼主2020/10/9 20:10
#include<iostream>
using namespace std;
int n,m,a[1000005],b[1000005],cnt=1;
int Half(int k) {
	int l=1,r=n;
	while(l<r) {
		int mid=(l+r)/2;
		if(a[mid]>=k) r=mid;
		else l=mid+1;
	}
	if(a[l]==k) return l;
	else return -1;
}
int main() {
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
		if(a[i]==a[i-1])  cnt++;
		if(a[i]!=a[i-1]) {
			if(!cnt) {
				b[i]=b[i-1]+1;
				continue;
			}
			b[i]=b[i-1]+cnt;
			cnt=1;
    	}
		else b[i]=b[i-1];
	}
	while(m--) {
		int k,t;
		cin>>k;
		t=Half(k);
		if(t==-1) cout<<-1<<' ';
		else cout<<b[Half(k)]<<' ';
	}
	cout<<'\n';
	return 0;
}

注:b数组是为了O(1)找出最靠前那个

2020/10/9 20:10
加载中...