1. 程式人生 > 其它 >Codeforces Round #789 (Div. 2) C. Tokitsukaze and Strange Inequality

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

這題的做法好像很多... 群裡大佬線段樹,樹狀陣列,二分什麼的都有