比赛 国庆欢乐赛2 评测结果 AWWWWTTTATTTTTTTTTTT
题目名称 排列 最终得分 10
用户昵称 陆晨洗 运行时间 28.144 s
代码语言 C++ 内存使用 3.45 MiB
提交时间 2025-10-04 11:31:10
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int a[50]={0};
bool b[50][50]={0};
bool c[50]={0};

void make(int x)
{
    int i;
    if(x==n+1)
    {
        ans++;
        ans=ans%1000000007;
        return;
    }
    for(i=1;i<=n;i++)
    {
        if(b[x][i]==true&&c[i]==false)
        {
            c[i]=true;
            make(x+1);
            c[i]=false;
        }
    }
    return;
}
void create(int x,int y,int z)
{
    int i;
    if(x==n+1)
    {
        return;
    }
    if(y<a[x])
    {
        y=a[x];
    }
    for(i=x-1;i>=1;i--)
    {
        if(a[i]>z)
        {
            b[x][a[i]]=true;
        }
    }
    if(a[x]==z)
    {
        z=a[x+1];
        for(i=x+2;i<=n;i++)
        {
            min(z,a[i]);
        }
    }
    for(i=x+1;i<=n;i++)
    {
        if(a[i]<y)
        {
            b[x][a[i]]=true;
        }
    }
    create(x+1,y,z);
    return;
}
int main()
{
    freopen("changgao_perm.in","r",stdin);
    freopen("changgao_perm.out","w",stdout);
    int i,j;
    cin>>n;
    ans=0;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i][a[i]]=true;
    }
    create(1,0,1);
    make(1);
    cout<<ans;
    return 0;
}