本地极限数据 400ms,CF 1000+ms TLE?
查看原帖
本地极限数据 400ms,CF 1000+ms TLE?
256970
xie_lzh楼主2023/7/22 09:47

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(

2023/7/22 09:47
加载中...