AtCoder Beginner Contest 468 C - Between P and Q 题解

前言

  • msjing看了看 \(D\) 是什么啥比回文,\(E\) 像个啥比推式子,于是写完 \(C\) 直接摆

solve

暴力出奇迹

  • 好吧其实这题就是爆搜
  • msjing都没往爆搜那想,以为是 \(DP\) 啥的
  • 正式开始
  • 我们发现 \(n \le 10\),这个范围 \(O(n^9)\) 都差不多能过
  • 我们研究发现基本上许多解法都会少决策,所以回归本真,直接搜
  • 枚举每个点可以放的值,如果可以就加入这个值,然后向下搜,到长度为 \(n\) 后判断,合法就统计答案
  • 这个东西用字符串很方便,加值简单,还支持直接用 \(>\)\(<\) 按字典序比较字符串
  • 然后没啥了,看代码就很好理解
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
constexpr int maxn=21;
int read()
{
    int 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<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int n;
string p,q;
int ans;
void dfs(int x,string s)
{
    if (x == n)
    {
        if (s>p && s<q) ans++;
        // cerr << "------------" << endl;
        // cerr << s << endl;
        // cerr << p << endl;
        // cerr << q << endl;
        // cerr << "------------" << endl;
        return;
    }
    int v[maxn]={};
    for (int i=1;i<=x;i++)
    {
        int x=s[i-1]-'0';
        v[x]=1;
    }
    for (int i=1;i<=n;i++)
    {
        if (v[i]) continue;
        string k=s;
        k+=i+'0';
        dfs(x+1,k);
    }
}
signed main()
{
    n=read();
    for (int i=1;i<=n;i++)
    {
        int x=read();
        p+=x+'0';
    }
    for (int i=1;i<=n;i++)
    {
        int x=read();
        q+=x+'0';
    }
    dfs(0,"");
    printf("%lld\n",ans);
    return 0;
}

后话

  • 这次 C 比之前几场都简单诶
  • msjing A 和 B 各吃一发罚时
posted @ 2026-07-25 21:43  msjing  阅读(10)  评论(0)    收藏  举报