给一串有n个数字的一串数,依次从中挑出m个数字,组成一个新的数,并使得这个数最大
n<=1e6 m<=1e5
下面蒟蒻代码
#include<bits/stdc++.h>
using namespace std;
int buc[1000100][10],a[1000100];
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
//cin>>a[i];
a[i]=rand()%10;
buc[i][a[i]]=1;
for(int j=0;j<10;j++){
buc[i][j]+=buc[i-1][j];
//cout<<buc[i][j]<<" ";
}
//cout<<endl;
}
int l=1,r;
bool flag=false;
for(int i=m-1;i>=0;i--){
r=n-i;
int num=0;
for(int j=9;j>=0;j--){
if(buc[r][j]-buc[l-1][j]>0){
num=j;
break;
}
}
if(num!=0){
flag=true;
}
if(flag){
cout<<num;
}
int l1=l,r1=r;
int wantnumber=buc[l-1][num]+1;
while(l1<=r1){
int mid=(l1+r1)/2;
if(buc[mid][num]==wantnumber){
r1=mid;
break;
}
if(buc[mid][num]<wantnumber){
l1=mid+1;
}else{
r1=mid-1;
}
}
l=r1+1;
}
if(!flag){
cout<<0;
}
//system("pause");
}
样例: IN 5 3 1 8 4 0 9
OUT 849