RT CF评测机这么慢吗(
#include<bits/stdc++.h>
using namespace std;
// #define int long long
#define ll long long
const int N=10000005;
bool st;
ll read()
{
ll r=0,f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-') f=0;
c=getchar();
}
while(isdigit(c))
{
r=(r<<1)+(r<<3)+c-48;
c=getchar();
}
return f?r:-r;
}
ll L,R;
int posl[20],posr[20];
int getreal(int x)
{
int pos[11];
int cnt=1;
for(;x;cnt++,x/=10)
{
pos[cnt]=x%10;
if(pos[cnt]==0) cnt--;
}
cnt--;
sort(pos+1,pos+1+cnt);
int sum=0;
for(int i=cnt;i>=1;i--) sum=sum*10+pos[i];
return sum;
}
void prepare()
{
ll sum=1000000000000000000ll;
for(int i=1;i<=19;i++)
{
posl[i]=(L/sum)%10;
posr[i]=(R/sum)%10;
sum/=10;
}
}
ll val[4700000],cnt;
int cntt[10];
bool solve(int x,bool flagl,bool flagr)
{
if(x>19) return 1;
int l=0,r=9;
if(flagl) l=posl[x];
if(flagr) r=posr[x];
for(int i=l+1;i<r;i++)
if(cntt[i]) return 1;
if(l==r)
{
if(cntt[l])
{
cntt[l]--;
if(solve(x+1,flagl,flagr)) return 1;
cntt[l]++;
}
else return false;
}
else
{
if(cntt[l])
{
cntt[l]--;
if(solve(x+1,flagl,0)) return 1;
cntt[l]++;
}
if(cntt[r])
{
cntt[r]--;
if(solve(x+1,0,flagr)) return 1;
cntt[r]++;
}
}
return false;
}
void dfs(int now,ll sum)
{
if(now>18)
{
if(sum==0) return ;
val[++cnt]=sum;
return ;
}
for(int i=sum%10;i<=9;i++)
dfs(now+1,sum*10+i);
}
bool ed;
signed main()
{
dfs(1,0);
L=read(); R=read();
prepare();
int ans=0;
for(int i=1;i<=cnt;i++)
{
if(val[i]>R) break;
ll x=val[i];
memset(cntt,0,sizeof cntt);
for(int j=1;j<=19;j++)
{
cntt[x%10]++;
x/=10;
}
if(solve(1,1,1)) ans++;
}
printf("%d\n",ans);
}
把我hack掉的数据是这个
146227656542999999 250000000000000000
但是本地400ms(