D - Distinct Trio
题意:
给的一个序列,求出
1
≤
i
<
j
<
k
≤
n
,
A
i
,
A
j
,
A
k
1\leq i<j<k \leq n,A_i,A_j,A_k
1≤i<j<k≤n,Ai,Aj,Ak 互不相同的元组
(
i
,
j
,
k
)
(i,j,k)
(i,j,k) 的个数
思路:
不妨设
A
i
≤
A
j
≤
A
k
A_i \leq A_j \leq A_k
Ai≤Aj≤Ak
枚举
A
j
A_j
Aj,维护一个前缀和即可求得答案
经典
d
p
dp
dp
拓展:
K
K
K 元组
code:
n = int(input())
a = [int(x) for x in input().split()]
maxn = int(2e5 + 1)
cnt = [0 for x in range(maxn)]
vis = [0 for x in range(maxn)]
for x in a :
cnt[x] += 1
vis[x] = 1
for i in range(1, maxn) :
cnt[i] += cnt[i-1]
ans = 0
for i in range(maxn) :
if vis[i] == 0 :
continue
ans += (n - cnt[i]) * (cnt[i] - cnt[i-1]) * cnt[i-1]
print(ans)
d
p
dp
dp 解法
code:
maxn = int(2e5 + 9)
n = int(input())
a = [int(x) for x in input().split()]
#给所有x-1存到列表a
dp = [[0 for i in range(5)] for j in range(maxn)]
#n*5的数组
cnt = [0 for i in range(maxn)]
for x in a :
cnt[x] += 1
dp[0][0] = 1
#dp[i][j]表示选了j个数,每个数都<=i,且这i个数互不相同的方法数
#dp[2e5][3]就是答案
for i in range(1, maxn) :
for j in range(5) :
if i + 1 < maxn :
dp[i][j] += dp[i - 1][j]#不选i
if i + 1 < maxn and j + 1 < 5 :
dp[i][j] += dp[i - 1][j - 1] * cnt[i]#选i
print(dp[maxn-9][3])