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;
    }
    
}

 

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

 

posted @ 2022-05-09 18:43  lviy_ptilopsis^^  阅读(87)  评论(0)    收藏  举报