1 条题解
-
1
#include <vector> #include <algorithm> using namespace std; const int MOD = 1000000007; const int MAXN = 1005; //树状数组 struct Fenwick{ int tree[MAXN]; int n; void init(int sz){ n=sz; for(int i=0;i<=n;i++) tree[i]=0; } void add(int pos,int val){ for(;pos<=n;pos += pos&-pos){ tree[pos] = (tree[pos] + val) % MOD; } } int query(int pos){ int res=0; for(;pos>0;pos -= pos&-pos){ res = (res + tree[pos]) % MOD; } return res; } }; int main() { ios::sync_with_stdio(false); int T; cin>>T; for(int caseNo=1;caseNo<=T;caseNo++) { int N,M; cin>>N>>M; vector<int> a(N); vector<int> b(N); for(int i=0;i<N;i++) { cin>>a[i]; b[i]=a[i]; } //离散化 sort(b.begin(),b.end()); b.erase(unique(b.begin(),b.end()),b.end()); for(int i=0;i<N;i++) { a[i] = lower_bound(b.begin(),b.end(),a[i]) - b.begin() + 1; //rank从1开始 } vector<int> prev(N,1); // prev[i]:以i结尾,长度为1的方案数,全部=1 Fenwick bit; for(int j=2;j<=M;j++) // 子序列长度j { bit.init(N); vector<int> cur(N,0); for(int i=0;i<N;i++) { int rk = a[i]; // 查询比rk小的所有前缀和 cur[i] = bit.query(rk-1); bit.add(rk, prev[i]); } prev.swap(cur); } int ans =0; for(int i=0;i<N;i++) { ans = (ans + prev[i]) % MOD; } cout<<"Case #"<<caseNo<<": "<<ans<<endl; } return 0; }
- 1
信息
- ID
- 208
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 19
- 已通过
- 5
- 上传者