表示没看懂算法3
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#define inf 1000000000
#define ll long long
using namespace std;
ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
char ch[100005];
ll K;
int n,a[100005];
struct data{int l,r,mn,val,sum;}t[400005];
void update(int k)
{
if(t[k<<1].val<=t[k<<1|1].val)
t[k].val=t[k<<1].val,t[k].mn=t[k<<1].mn;
else t[k].val=t[k<<1|1].val,t[k].mn=t[k<<1|1].mn;
t[k].sum=t[k<<1].sum+t[k<<1|1].sum;
}
void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;
if(l==r){t[k].val=inf;t[k].mn=l;return;}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
update(k);
}
void modify(int k,int pos,int val)
{
int l=t[k].l,r=t[k].r;
if(l==r){t[k].val=val;if(val!=inf)t[k].sum=1;else t[k].sum=0;return;}
int mid=(l+r)>>1;
if(pos<=mid)
modify(k<<1,pos,val);
else modify(k<<1|1,pos,val);
update(k);
}
int query(int k,int x,int y)
{
int l=t[k].l,r=t[k].r;
if(x==l&&y==r)return k;
int mid=(l+r)>>1;
if(y<=mid)return query(k<<1,x,y);
else if(x>mid)return query(k<<1|1,x,y);
else
{
int t1=query(k<<1,x,mid),t2=query(k<<1|1,mid+1,y);
if(t[t1].val<=t[t2].val)return t1;
else return t2;
}
}
int getsum(int k,int x,int y)
{
int l=t[k].l,r=t[k].r;
if(x==l&&y==r)return t[k].sum;
int mid=(l+r)>>1;
if(y<=mid)return getsum(k<<1,x,y);
else if(x>mid)return getsum(k<<1|1,x,y);
else return getsum(k<<1,x,mid)+getsum(k<<1|1,mid+1,y);
}
int find(int x,ll val)
{
int l=x+1,r=n,tmp=x;
while(l<=r)
{
int mid=(l+r)>>1;
if(getsum(1,x+1,mid)<=val)tmp=mid,l=mid+1;
else r=mid-1;
}
return tmp;
}
bool solve(int x)
{
int now=t[query(1,x,x)].val;
if(now==inf)return 0;
if(!K){printf("%c",now+'a');return 0;}
int lim=find(x,K);
int tmp=query(1,x+1,lim);
if(t[tmp].val>=now){printf("%c",now+'a');return 0;}
printf("%c",t[tmp].val+'a');
K-=getsum(1,x,t[tmp].mn)-1;
modify(1,t[tmp].mn,inf);
return 1;
}
int main()
{
K=read();
scanf("%s",ch+1);
n=strlen(ch+1);
for(int i=1;i<=n;i++)a[i]=ch[i]-'a';
build(1,1,n);
for(int i=1;i<=n;i++)
modify(1,i,a[i]);
for(int i=1;i<n;)
if(!solve(i))i++;
int tmp=t[query(1,n,n)].val;
if(tmp!=inf)printf("%c",tmp+'a');
puts("");
return 0;
}