Codeforces Round #789 (Div. 2) C. Tokitsukaze and Strange Inequality
阿新 • • 發佈:2022-05-09
題目大意:
給出一個長度為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; } }
這題的做法好像很多... 群裡大佬線段樹,樹狀陣列,二分什麼的都有