fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. using ull = unsigned long long;
  5.  
  6. int main(){
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9.  
  10. int n;
  11. if(!(cin >> n)) return 0;
  12. vector<ll> a(n);
  13. for(int i = 0; i < n; ++i) cin >> a[i];
  14.  
  15. int l = n/2;
  16. int r = n - l;
  17.  
  18. unordered_map<ll, ull> left_map;
  19. left_map.reserve(1u << max(0, min(20, l))); // reserve heuristics
  20.  
  21. // tất cả subset của nửa trái, lưu sum -> fullmask (mask trên toàn mảng, thấp)
  22. for(ull mask = 0; mask < (1ull << l); ++mask){
  23. ll s = 0;
  24. for(int i = 0; i < l; ++i){
  25. if(mask & (1ull << i)) s += a[i];
  26. }
  27. ull fullmask = mask; // thấp l bit
  28. auto it = left_map.find(s);
  29. if(it != left_map.end()){
  30. if(it->second != fullmask){ // đảm bảo khác nhau
  31. // in kết quả:
  32. ull m1 = it->second, m2 = fullmask;
  33. cout << s << '\n';
  34. // subset 1
  35. vector<int> idx1, idx2;
  36. for(int i = 0; i < n; ++i){
  37. if(m1 & (1ull << i)) idx1.push_back(i);
  38. }
  39. for(int i = 0; i < n; ++i){
  40. if(m2 & (1ull << i)) idx2.push_back(i);
  41. }
  42. // in chỉ số 1-based và giá trị
  43. cout << idx1.size();
  44. for(int x : idx1) cout << ' ' << (x+1);
  45. cout << '\n';
  46. for(int x : idx1) cout << a[x] << ( (&x == &idx1.back()) ? '\n' : ' ');
  47. cout << idx2.size();
  48. for(int x : idx2) cout << ' ' << (x+1);
  49. cout << '\n';
  50. for(int x : idx2) cout << a[x] << ( (&x == &idx2.back()) ? '\n' : ' ');
  51. return 0;
  52. }
  53. } else {
  54. left_map[s] = fullmask;
  55. }
  56. }
  57.  
  58. unordered_map<ll, ull> right_map;
  59. right_map.reserve(1u << max(0, min(20, r)));
  60.  
  61. // tất cả subset của nửa phải, lưu sum -> fullmask (đã dịch lên bit cao)
  62. for(ull mask = 0; mask < (1ull << r); ++mask){
  63. ll s = 0;
  64. for(int i = 0; i < r; ++i){
  65. if(mask & (1ull << i)) s += a[l + i];
  66. }
  67. ull fullmask = (mask << l); // dịch sang các bit cao
  68. auto it = right_map.find(s);
  69. if(it != right_map.end()){
  70. if(it->second != fullmask){
  71. ull m1 = it->second, m2 = fullmask;
  72. cout << s << '\n';
  73. vector<int> idx1, idx2;
  74. for(int i = 0; i < n; ++i){
  75. if(m1 & (1ull << i)) idx1.push_back(i);
  76. }
  77. for(int i = 0; i < n; ++i){
  78. if(m2 & (1ull << i)) idx2.push_back(i);
  79. }
  80. cout << idx1.size();
  81. for(int x : idx1) cout << ' ' << (x+1);
  82. cout << '\n';
  83. for(int x : idx1) cout << a[x] << ( (&x == &idx1.back()) ? '\n' : ' ');
  84. cout << idx2.size();
  85. for(int x : idx2) cout << ' ' << (x+1);
  86. cout << '\n';
  87. for(int x : idx2) cout << a[x] << ( (&x == &idx2.back()) ? '\n' : ' ');
  88. return 0;
  89. }
  90. } else {
  91. right_map[s] = fullmask;
  92. }
  93. }
  94.  
  95. // giao giữa left và right: nếu sum xuất hiện ở cả hai, lấy hai mask (kiểm tra khác nhau)
  96. for(auto &p : left_map){
  97. ll s = p.first;
  98. ull m1 = p.second;
  99. auto it = right_map.find(s);
  100. if(it != right_map.end()){
  101. ull m2 = it->second;
  102. if(m1 == m2) continue; // (chỉ có thể xảy ra khi cả hai bằng 0) bỏ qua
  103. cout << s << '\n';
  104. vector<int> idx1, idx2;
  105. for(int i = 0; i < n; ++i){
  106. if(m1 & (1ull << i)) idx1.push_back(i);
  107. }
  108. for(int i = 0; i < n; ++i){
  109. if(m2 & (1ull << i)) idx2.push_back(i);
  110. }
  111. cout << idx1.size();
  112. for(int x : idx1) cout << ' ' << (x+1);
  113. cout << '\n';
  114. for(int x : idx1) cout << a[x] << ( (&x == &idx1.back()) ? '\n' : ' ');
  115. cout << idx2.size();
  116. for(int x : idx2) cout << ' ' << (x+1);
  117. cout << '\n';
  118. for(int x : idx2) cout << a[x] << ( (&x == &idx2.back()) ? '\n' : ' ');
  119. return 0;
  120. }
  121. }
  122.  
  123. // theo giả thiết đề, không nên tới đây
  124. cout << "Khong tim thay\n";
  125. return 0;
  126. }
  127.  
Success #stdin #stdout 0.01s 5316KB
stdin
4
1 2 4 7
stdout
Khong tim thay