1 solutions

  • 0
    @ 2025-4-24 11:38:39

    先统计元素的可以检查的数目,然后根据枚举区间的贡献进行答案更新,为了方便,这里我们可以从区间的中点开始往两边扩展。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=7510;
    int a[N],b[N],ans[N];
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        int cnt=0;
        for(int i=1;i<=n;i++) //初始数目
        {
            cin>>b[i];
            if(a[i]==b[i])
            {
                cnt++;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<2;j++)
            {
                int sum=cnt;
                for(int l=i,r=i+j;l>=1&&r<=n;l--,r++) //往两边扩展
                {
                    //去掉原始的影响
                    if(a[l]==b[l]) sum--;
                    if(a[r]==b[r]) sum--;
                    //假设已经交换完成
                    //加上交换的影响
                    if(a[r]==b[l]) sum++;
                    if(b[r]==a[l]) sum++;
                    ans[sum]++;
                }
            }
        }
        for(int i=0;i<=n;i++)
        {
            cout<<ans[i]<<endl;
        }
        return 0;
    }
    
    • 1

    Information

    ID
    2581
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    1
    Accepted
    1
    Uploaded By