https://www.luogu.org/problem/show?pid=1323
对于集合元素的求法,我们可以大力queue
直接建一颗小根堆;
对于最后求答案,那么直接贪心就好了;
大力找到第一个递增序列,删掉第一个元素
#include<bits/stdc++.h>
#define Ll long long
using namespace std;
priority_queue<Ll ,vector<Ll >,greater<Ll > >Q;
Ll a[100],ll;
int v[3000000],top;
Ll n,m,k,l;
char c[3000000];
bool b[3000000];
int main()
{
scanf("%lld%lld",&n,&m);
Q.push(1);
while(n--){
Ll x=Q.top();Q.pop();
Q.push(x*2+1);
Q.push(x*4+5);
for(;x;x=x/10)a[++ll]=x%10;
while(ll)c[++l]=char(a[ll--]+48);
}
for(Ll i=1;i<=l;i++)printf("%c",c[i]);cout<<endl;
for(int i=1;i<=l&&m;i++){
while(top&&m&&c[v[top]]<c[i])b[v[top--]]=1,m--;
v[++top]=i;
}
for(Ll i=1;i<=l;i++)if(!b[i])printf("%c",c[i]);
}