Published on 2022-05-09 18:43 in 分类: Codeforces , dp with lviy_ptilopsis^^
分类: Codeforces , dp

Codeforces Round #789 (Div. 2) C. Tokitsukaze and Strange Inequality

    题目大意:

    给出一个长度为n的排列,让你找出有多少种四元组[a, b, c, d] 满足

     

     输出数量。 T <= 1000 , n<=5000

    题目思路:

    显然a与c相关,b与d相关,那么只要能预处理出a与c的状态便可以直接求解答案

    考虑线性dp求方案,直接硬枚举每个a与c, 对于每个a,记录一下a为i时候的所有满足条件的j,放进f[i][j],然后再让f[i][j] += f[i -1][j] (因为求得是所有包括i与j之前的方案数)

    然后再枚举b, d直接判断求答案即可, 对于i为d, j为b,满足条件时,ans  += f[i - 1][j - 1]

    时间复杂度 O(n^2)  pretest 93ms/124ms

    memset让我爆T两发(T_T) 后来发现好像都是直接从0的状态转移来的,初始化0即可。

     

    复制代码
    #include <bits/stdc++.h>
    //#define int long long
    #define endl '\n'
    using namespace std;
    typedef long long LL;
    const int N = 5010;
    LL f[N][N];
    int q[N];
        
    signed main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            //memset(f, 0, sizeof f); 
            int n;
            cin>>n;
            for(int i = 1; i <= n; i++) scanf("%d", &q[i]);
            for(int i = 0; i <= n; i++) f[0][i] = 0, f[1][i] = 0;
            for(int i = 2; i <= n; i++)
            {
                int tem = 0;
                for(int j = 1; j <= i - 2; j++) 
                {
                    if(q[i] > q[j]) tem++;
                    f[i][j] = f[i - 1][j] + tem;
                }
            }
            LL ans = 0;
            for(int i = 4; i <= n; i++)
                for(int j = 2; j <= i - 2; j++) 
                    if(q[i] < q[j]) ans += f[i - 1][j - 1];
                
            cout<<ans<<endl;
        }
        
    }
    复制代码

     

    这题的做法好像很多... 群里大佬线段树,树状数组,二分什么的都有

     


    作者:@lviy_ptilopsis_
    本文为作者原创,转载请注明出处:https://www.cnblogs.com/lviy/p/16250396.html

    posted @   lviy_ptilopsis^^  阅读(80)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
    · .NET 10 首个预览版发布,跨平台开发与性能全面提升
    · 《HelloGitHub》第 107 期
    · 全程使用 AI 从 0 到 1 写了个小工具
    · 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
    点击右上角即可分享
    微信分享提示