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; } }
这题的做法好像很多... 群里大佬线段树,树状数组,二分什么的都有