提交时间:2024-11-19 15:13:19
运行 ID: 34853
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } typedef __int128_t i128; string s; i128 k; void cmn(pair<i128,i128>&a,pair<i128,i128>b){a=max(a,b);} pair<i128,i128> operator+(pair<i128,i128>a,pair<i128,i128>b){return m_p(a.p1+b.p1,a.p2+b.p2);} pair<i128,i128>f[1<<20]; vector<int>g[1<<20]; i128 pw[20]; #define ppc __builtin_popcount void pr(i128 x,int len){ vector<int>vec; while(len--)vec.p_b(int(x%10)),x/=10; reverse(vec.begin(),vec.end()); for(int x:vec)printf("%d",x); } void brute(int n,string s){ up(i,0,(1<<n)-1)g[ppc(i)].p_b(i); f[0]=m_p(0,0); pw[0]=1;up(i,1,19)pw[i]=pw[i-1]*(i128)10; up(i,0,n-1)for(int x:g[i]){ auto v=f[x]; int c=0; up(j,0,n-1)if(!((x>>j)&1)){ auto val=v;i128 add=pw[n-1-i]*(i128)(s[j]-'0'); val.p1+=add,val.p2+=add;val.p1-=c*k; cmn(f[x|(1<<j)],val);c++; } }pr(f[(1<<n)-1].p2,n); } int del[maxn]; set<int>loc[maxn]; void slv(){ cin>>s;k=read();int n=s.size(); up(i,0,n-1)loc[s[i]-'0'].insert(i); int len=0,pos=0; while(len+20<n){ if(del[pos]){pos++;continue;} int p=0; down(i,9,0)if(loc[i].size()){p=i;break;}printf("%d",p); if(loc[p].count(pos)){ loc[p].erase(pos); pos++; }else { int d=0;up(i,0,9)if(loc[d].count(pos))loc[d].erase(pos); int q=*loc[p].begin(); del[q]=1;loc[p].erase(q); }len++; }string now=""; up(i,pos,n-1)if(!del[i])now.p_b(s[i]); brute(now.size(),now); }int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }