C. Permutation Partitions
题意:
给你长度为
n
n
n 的序列,将其分成
k
k
k 个不相交的段,取每段中的最大值相加,输出和的最大值以及共有多少种分法。
思路:
序列中的前
k
k
k 大的数的和就是最大值,然后有
p
1
,
p
2
,
.
.
.
,
p
k
p_1,p_2,...,p_k
p1,p2,...,pk,表示这
k
k
k 个数的位置,每两个相邻的
p
p
p之间的距离的乘积就是全部的分法。
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
const ll mod = 998244353;
struct node
{
ll val, id;
} a[maxn];
bool cmp(node A, node B) { return A.val > B.val; }
bool cmp1(node A, node B) { return A.id < B.id; }
int main()
{
int n, k;
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i].val), a[i].id = i;
ll sum = 0, cnt = 1;
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= k; i++)
sum += a[i].val;
sort(a + 1, a + k + 1, cmp1);
for (int i = 2; i <= k; i++)
cnt = cnt * (a[i].id - a[i - 1].id) % mod;
printf("%lld %lld\n", sum, cnt);
return 0;
}