fork download
  1. #include <cstdio>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. // Hàm sinh hoán vị tiếp theo trong thứ tự từ điển.
  6. // Trả về `k` là vị trí mà hoán vị bắt đầu thay
  7. // đổi so với hoán vị trước.
  8. // k < 0 nếu đây đã là hoán vị cuối cùng.
  9. int next(vector<int> &a) {
  10. int k, l, n = a.size();
  11. for (k = n-2; k>=0; k--) if (a[k] < a[k+1]) break;
  12. if (k<0) return k;
  13. for (l = n-1; l>k; l--) if (a[k] < a[l]) break;
  14. swap(a[k], a[l]);
  15. for (int i=k+1, j=n-1; i<j; i++, j--) swap(a[i], a[j]);
  16. return k;
  17. }
  18.  
  19. bool f[1000];
  20. int seed = 0;
  21. int cache[1001];
  22.  
  23. // Kiểm tra xem tại a[i] có thỏa điều kiện L < R
  24. // như đã giải thích ở trên hay không.
  25. bool check(const vector<int> &a, int i) {
  26. int n = a.size();
  27. seed += 1;
  28. int r = 1e9;
  29. // Tìm R là giá trị nhỏ nhất ở bên phải a[i]
  30. // Đồng thời đánh dấu các giá trị xuất hiện
  31. // ở bên phải a[i]
  32. for (int j=i+1; j<n; j++) {
  33. cache[a[j]] = seed;
  34. r = min(r, a[j]);
  35. }
  36. // Tìm L là giá trị lớn nhất nhỏ hơn a[i]
  37. // ở bên trái a[i] => L không xuất hiện ở bên phải
  38. int l = 0;
  39. for (int j=a[i]-1; j>=1; j--) {
  40. if (cache[j] != seed) {
  41. l = j;
  42. break;
  43. }
  44. }
  45. return l < r;
  46. }
  47.  
  48. // Lần lượt kiểm tra và cập nhật các phần tử
  49. // từ a[k] trở lên, đồng thời kiểm tra xem
  50. // tất cả các phần tử có thỏa mãn điều kiện
  51. // L < R hay không.
  52. bool ok(const vector<int> &a, int k) {
  53. int n = a.size();
  54. for (int i=k; i<n; i++) {
  55. f[i] = check(a, i);
  56. if (i>0) f[i] &= f[i-1];
  57. }
  58. return f[n-1];
  59. }
  60.  
  61. int main() {
  62. int n, m;
  63. scanf("%d%d", &n, &m);
  64. vector<int> a(n);
  65. for (int i=0; i<n; i++) scanf("%d", &a[i]);
  66.  
  67. int k = 0, count = 0;
  68. while (m--) {
  69. if (ok(a, k)) count++;
  70. k = next(a);
  71. if (k < 0) break;
  72. }
  73.  
  74. printf("%d", count);
  75. return 0;
  76. }
  77.  
Runtime error #stdin #stdout #stderr 0s 15240KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc