Mnzn求救
查看原帖
Mnzn求救
416242
New_hope楼主2024/3/4 19:03

WA 飞了

#include<bits/stdc++.h>
#define int long long
#define _ (int)(1e3 + 4)
using namespace std;

struct io { int v, id, st; };
const int mod = 1e9 + 7;
int n, m, p, c, ans, t, id;
int tr[_][_], b[_];
io a[_];

bool cmp(io a, io b) {
    return a.v < b.v;
}
int lb(int x) { return x & (-x); }
void clear()
{
    ans = 0;
    for(int i = 1; i <= n; i ++) {
        for(int j = 1; j <= n; j ++) {
            tr[i][j] = 0;
        }
    }
}
void add(int p, int x, int k) {
    while(p <= n) (tr[p][x] += k) % mod, p += lb(p);
}
int sum(int p, int x) {
    int r = 0;
    while(p) (r += tr[p][x]) % mod, p -= lb(p);
    return r; 
}
void work()
{
    cin >> n >> m;
    clear();
    for(int i = 1; i <= n; i ++) {
        cin >> a[i].v; a[i].id = i;
    }
    sort(a + 1, a + 1 + n, cmp);
    p = 0, c = 0;
    for(int i = 1; i <= n; i ++) {
        if(a[i].v != p) {
            p = a[i].v;
            b[a[i].id] = ++c;
        } 
        else b[a[i].id] = c;
    }
    for(int i = 1; i <= n; i ++) {
        add(b[i], 1, 1); // dp[i][1] = 1
        for(int j = 2; j <= m; j ++) {
            int nd = sum(b[i] - 1, j - 1); // dp[i][j] = sum(dp[k][j-1]) [a[k] < a[i]]
            add(b[i], j, nd);
            if(j == m) (ans += nd) % mod;
        }
    }
    if(m == 1) ans += n;
    printf("Case #%lld: %lld\n", id, ans);
}
signed main()
{
    cin >> t;
    while(t --) ++ id, work();

    return 0;
}
//Case #1: 3
2024/3/4 19:03
加载中...