这道题卡的很死,注意:nth_element只能得60分
所以我推荐的方法就是归并
归并
这就不用太说了,不知道的可以看看注释😙
void merge(int l,int r){
int i,j,q,mid;
for(q=l;q<=r;q++) b[q]=a[q];
q=i=l;//第一个元素的位置
mid=ans-n;//原来的最后一个元素的位置
j=mid+1;//新增的第一个元素的位置
while(i<=mid && j<=r){//原来的和新增的都没用完,比较谁小,谁小拿走谁
if(b[i]<b[j]) a[q++]=b[i++];//b[i]小,拿走b[i]
else a[q++]=b[j++];//b[j]小,拿走b[j]
}
while(i<=mid) a[q++]=b[i++];//新增的用完了,原来的还有,把原来的拿走,直到也原来的没有了为止
while(j<=r) a[q++]=b[j++];//原来的用完了,新增的还有,把新增的拿走,直到也新增的没有了为止
}后面根据题意写int main()
cin>>m;
while(m--){
cin>>n;
ans+=n;
cin>>a[ans-n+1]>>k;
for(long long i=ans-n+2;i<=ans;i++)
a[i]=(a[i-1]*1234567+7654321)%mod+1;
sort(a+ans-n+1,a+ans+1);//给新增的排序,因为归并是原来和新增的都是有序的,才能归并
merge(1,ans);
//for(int i=1;i<=ans;i++) cout<<a[i]<<" ";
//cout<<endl;
cout<<a[k]<<endl;//输出第k小的
}如果这道题不会,可以去看看随机数随机算,这道题和随机数随机算2很相似
文章介绍了一种利用归并排序处理数组插入新元素并找到指定位置元素的算法。在nth_element函数不能完全满足要求的情况下,通过归并操作将新插入的有序数组与原数组合并,并能有效地找到第k小的元素。
6746

被折叠的 条评论
为什么被折叠?



