题解 UVA12983 【The Battle of Chibi】
本蒟蒻第一次发题解,如有不对之处,欢迎各位dalao指正。
这道题的核心是dp,设
那么可以得到
但是转移是
可以发现,对于每个
这样就可以优化到
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e3 + 5;
const LL MOD = 1e9 + 7;
int n, m;
LL f[maxn][maxn], A[maxn], C[maxn];
LL tmp[maxn], tmp_cnt;
int Key(LL val) {
int l = 1, r = tmp_cnt;
while (l <= r) {
int mid = (l + r) >> 1;
if (tmp[mid] == val) return mid;
if (tmp[mid] < val) l = mid + 1;
else r = mid - 1;
}
return -1;
}
inline int lowbit(int x) { return x & -x; }
int ask(int x) {
LL ret = 0;
for (; x; x -= lowbit(x)) ret += C[x], ret %= MOD;
return ret;
}
void add(int x, LL val) {
for(; x <= tmp_cnt; x += lowbit(x)) C[x] += val, C[x] %= MOD;
}
int main() {
// freopen("testdata.in", "r", stdin);
// freopen("testdata.out", "w", stdout);
int G; scanf("%d", &G);
for (int T = 1; T <= G; T++) {
printf("Case #%d: ", T);
memset(f, 0, sizeof(f));
scanf("%d%d", &n, &m), tmp_cnt = n;
for (int i = 1; i <= n; i++)
scanf("%lld", &A[i]), tmp[i] = A[i], f[i][1] = 1;
sort(tmp + 1, tmp + 1 + tmp_cnt);
tmp_cnt = unique(tmp + 1, tmp + 1 + tmp_cnt) - tmp - 1;
for (int j = 2; j <= m; j++) {
memset(C, 0, sizeof(C));
for (int i = 1; i <= n; i++) {
int k = Key(A[i]);
f[i][j] = ask(k - 1), add(k, f[i][j - 1]);
}
}
LL ans = 0;
for (int i = 1; i <= n; i++) ans = (ans + f[i][m]) % MOD;
printf("%lld\n", ans);
}
return 0;
}