fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9. const int MOD = 5e6;
  10. const int N = 1e4 + 5;
  11. const int K = 55;
  12. const int S = 1e5 + 5;
  13.  
  14. int n, k;
  15. int a[N];
  16. int dp[N][K]; // dp[i][k] = số dãy con tăng độ dài k mà kết thúc tại i
  17.  
  18. int ft[K][S];
  19.  
  20. int getSum(int len, int i) {
  21. int ans = 0;
  22. for (; i > 0; i -= i & (-i)) (ans += ft[len][i]) %= MOD;
  23. return ans;
  24. }
  25.  
  26. void update(int len, int i, int val) {
  27. for (; i < S; i += i & (-i)) (ft[len][i] += val) %= MOD;
  28. }
  29.  
  30. int main() {
  31. ios::sync_with_stdio(0); cin.tie(0);
  32. cin >> n >> k;
  33. for (int i = 1; i <= n; i++) cin >> a[i], ++a[i];
  34.  
  35. // for (int i = 1; i <= n; i++) {
  36. // // a[i] đứng một mình
  37. // dp[i][1] = 1;
  38.  
  39. // for (int len = 2; len <= k; len++) {
  40. // int sum_dp = 0;
  41. // for (int j = 1; j < i; j++) {
  42. // // lấy tổng dp[j][len - 1] của những thằng j đằng trước
  43. // // sao cho a[j] thuộc đoạn [1, a[i] - 1]
  44. // if (a[j] < a[i]) (sum_dp += dp[j][len - 1]) %= MOD;
  45. // }
  46. // (dp[i][len] += sum_dp) %= MOD;
  47. // }
  48. // } // O(n^2 * k)
  49.  
  50. for (int i = 1; i <= n; i++) {
  51. dp[i][1] = 1;
  52.  
  53. for (int len = 2; len <= k; len++) {
  54. int sum_dp = getSum(len - 1, a[i] - 1);
  55. (dp[i][len] += sum_dp) %= MOD;
  56. }
  57.  
  58. for (int len = 1; len <= k; len++) update(len, a[i], dp[i][len]);
  59. }
  60.  
  61. int ans = 0;
  62. for (int i = 1; i <= n; i++) {
  63. (ans += dp[i][k]) %= MOD;
  64. }
  65.  
  66. cout << ans << '\n';
  67. }
  68.  
Success #stdin #stdout 0.01s 5688KB
stdin
4 3
1
2
2
10
stdout
2