树状数组优化dp,TLE,求调
查看原帖
树状数组优化dp,TLE,求调
756684
寄风孤影楼主2024/5/6 08:51

RT

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1005 , M = 1005 , T = 105 , A = 1e9 , mod = 1e9 + 7;
int a[N] , b[N] , dp[2][N] , wc , n , m;
//dp[i][j]:长度为i的结尾是a_j的严格上升子序列个数
namespace BIT{
    int c[N];
    inline void clear(){
        memset(c , 0 , sizeof(c));
    }
    inline int lowbit(int x){
        return x & (-x);
    }
    inline void add(int pos , int now){
        for(;pos <= n;pos += lowbit(pos)){
            c[pos] += now;
        }
    }
    inline int query(int pos){
        int qwq = 0;
        for(;pos;pos -= lowbit(pos)) qwq += c[pos];
        return qwq;
    }
};
using namespace BIT;
inline void solve(){
    cin >> n >> m;
    for(int i = 1;i <= n;i++){
        cin >> a[i];
        b[i] = a[i];
    }
    map <int , int> mp;
    sort(b + 1 , b + n + 1);
    for(int i = 1;i <= n;i++){
        mp[b[i]] = i;
    }
    memset(dp , 0 , sizeof(dp));
    for(int i = 0;i <= n;i++){
        dp[0][i] = 1;
    }
    for(int i = 2;i <= m;i++){
        clear();
        for(int j = 0;j <= n;j++){
            dp[1][j] = dp[0][j];
            dp[0][j] = 0;
        }
        for(int j = 1;j <= n;j++){
            (dp[0][j] += query(mp[a[j]])) %= mod;
            add(mp[a[j]] , dp[1][j]);
            // for(int k = 1;k < j;k++){
            //     if(a[j] > a[k]){
            //         (dp[i][j] += dp[i - 1][k]) %= mod;
            //     }
            // }
        }
    }
    int ans = 0;
    for(int i = 1;i <= n;i++){
        (ans += dp[0][i]) %= mod;
    }
    cout << "Case #" << (++wc) << ": " << ans << endl;
}
signed main(){
    int t;
    cin >> t;
    while(t--) solve();
    return 0;
}
2024/5/6 08:51
加载中...