fork download
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define fast ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
  4. #define lg2(n) (63-__builtin_clzll(n))
  5. #define mask(n) (1LL << (n))
  6. #define TASK ""
  7. #define openfile(); if( fopen(TASK".inp", "r")){freopen(TASK".inp", "r", stdin);freopen(TASK".out", "w", stdout);}
  8. #define lc(n) (n << 1)
  9. #define rc(n) ((n << 1) | 1)
  10.  
  11. #define fi first
  12. #define se second
  13. #define FOR(i, l, r, k) for( int i = l; i <= r; i += k)
  14. #define FOD(i, r, l, k) for( int i = r; i >= l; i -= k)
  15.  
  16. #define mii map<int,int>
  17. #define umi unordered_map<int, int>
  18. #define pii pair<int,int>
  19. #define vi vector<int>
  20.  
  21. using namespace std;
  22.  
  23. const int oo = 1e18;
  24. const int mod = 998244353;
  25. const int nmax = 2e5 + 8;
  26. const int base = 311;
  27.  
  28. int n, k, a[nmax], x, st[19][nmax], f[nmax];
  29.  
  30. vi pos[nmax];
  31.  
  32. void pre(){
  33. for(int i = 1; i <= n; ++i) st[0][i] = a[i];
  34. for(int i = 1; i <= lg2(n); ++i){
  35. for(int j = 1; j <= n - mask(i) + 1; ++j){
  36. st[i][j] = min(st[i - 1][j], st[i - 1][j + mask(i - 1)]);
  37. }
  38. }
  39. }
  40.  
  41. int get(int l, int r){
  42. int k = lg2(r - l + 1);
  43. return min(st[k][l], st[k][r - mask(k) + 1]);
  44. }
  45.  
  46. void cmp(){
  47. vector<int> v;
  48. for(int i = 1; i <= n; ++i) v.push_back(a[i]);
  49. sort(v.begin(), v.end());
  50. v.erase(unique(v.begin(), v.end()), v.end());
  51. for(int i = 1; i <= n; ++i){
  52. a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
  53. }
  54. }
  55. int sol(int i, int val, const vi &v){
  56. int l = 0, r = v.size() - 1, pos = -1;
  57. while(l <= r){
  58. int mid = l + r >> 1;
  59. bool ok = 1;
  60. ok = (v[mid] + 1 <= i - 1 && get(v[mid] + 1, i - 1) < a[i]);
  61. if(v[mid] <= i - val && ok){
  62. l = mid + 1;
  63. pos = mid;
  64. }
  65. else r = mid - 1;
  66. }
  67. return pos;
  68. }
  69. int pf[nmax];
  70. int calc(int val){
  71. vector<vi> dp(k + 1, vi(n + 1, 0));
  72. // vector<vi> pf(n + 1, 0);
  73. for(int i = 1; i <= n; ++i){
  74. f[i] = 0;
  75. int j = sol(i, val, pos[a[i]]);
  76. if(j != -1) f[i] = i - pos[a[i]][j] + 1;
  77. if(f[i - 1]){
  78. if(f[i]) f[i] = min(f[i], f[i - 1] + 1);
  79. else f[i] = f[i - 1] + 1;
  80. }
  81. if(!val) f[i] = 1;
  82. }
  83. dp[0][0] = 1, pf[0] = 1;
  84. for(int i = 1; i <= k; ++i){
  85. pf[0] = dp[i - 1][0];
  86. for(int j = 1; j <= n; ++j){
  87. pf[j] = (pf[j - 1] + dp[i - 1][j]) % mod;
  88. }
  89. for(int j = 1; j <= n; ++j){
  90. if(f[j]){
  91. dp[i][j] = pf[j - f[j]];
  92. }
  93. // cout << i << ' ' << j << ' ' << dp[i][j] << endl;
  94. }
  95. }
  96. return dp[k][n];
  97. }
  98.  
  99. main(){
  100. fast;
  101. openfile();
  102. cin >> n >> k >> x;
  103. for(int i = 1; i <= n; ++i){
  104. cin >> a[i];
  105. }
  106. cmp();
  107. pre();
  108. for(int i = 1; i <= n; ++i){
  109. pos[a[i]].push_back(i);
  110. }
  111. cout << (calc(x) - calc(x + 1) + mod) % mod;
  112. }
  113.  
Success #stdin #stdout 0.01s 9780KB
stdin
Standard input is empty
stdout
Standard output is empty