fork download
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp> //required
  3. #include <ext/pb_ds/tree_policy.hpp> //required
  4.  
  5. using namespace __gnu_pbds; // required
  6. using namespace std;
  7. template<typename T>
  8. using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  9. #define set ordered_set
  10. #define AboRadwan ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
  11. #define ll long long
  12. #define all(v) v.begin(), v.end()
  13. //#define endl "\n"
  14. const int N = 1e6 + 50, NN = 1005, mod = 1e9 + 7;
  15.  
  16. vector<string> split(string s, string delimiter) {
  17. size_t pos_start = 0, pos_end, delim_len = delimiter.length();
  18. string token;
  19. vector<string> res;
  20.  
  21. while ((pos_end = s.find(delimiter, pos_start)) != string::npos) {
  22. token = s.substr(pos_start, pos_end - pos_start);
  23. pos_start = pos_end + delim_len;
  24. res.push_back(token);
  25. }
  26.  
  27. res.push_back(s.substr(pos_start));
  28. return res;
  29. }
  30.  
  31. void solve() {
  32. string s;
  33. cin >> s;
  34. ll k;
  35. cin >> k;
  36. vector<string> vals = split(s, "|");
  37. vector<pair<ll, ll>> v;
  38. ll zero = -1;
  39. for (int i = 1; i < vals.size(); ++i) {
  40. if (vals[i] != "0")v.push_back({stoll(vals[i]), -i});
  41. else zero = i;
  42. }
  43. sort(all(v));
  44. bool neg = 0, pos = 0;
  45. for (auto i: v) {
  46. if (i.first > 0)pos = 1;
  47. else neg = 1;
  48. }
  49. vector<ll> ans;
  50. if (neg == 0) {
  51. while (k--) {
  52. ans.push_back(-v.back().second);
  53. v.pop_back();
  54. }
  55. }
  56. else if (pos == 0) {
  57. for (int i = 0; i < v.size(); ++i) {
  58. v[i].second *= -1;
  59. }
  60. sort(all(v));
  61. if (k % 2 != 0) {
  62. if(zero==-1) {
  63. ans.push_back(v.back().second);
  64. v.pop_back();
  65. }
  66. else{
  67. ans.push_back(zero);
  68. for (int i = 1; i < k; ++i) {
  69. if(i==zero)++k;
  70. else ans.push_back(i);
  71. }
  72. }
  73. } else {
  74. for (int i = 0; i < k; ++i) {
  75. ans.push_back(-v[i].second);
  76. }
  77. }
  78. } else {
  79. if (k % 2 != 0) {
  80. --k;
  81. ans.push_back(v.back().second);
  82. v.pop_back();
  83. }
  84. for (int i = 0, j = v.size() - 1; i < j;) {
  85. if (v[j].first * v[j - 1].first > v[i].first * v[i + 1].first) {
  86. ans.push_back(v[j].second);
  87. ans.push_back(v[j - 1].second);
  88. j -= 2;
  89. } else if (v[j].first * v[j - 1].first < v[i].first * v[i + 1].first) {
  90. ans.push_back(v[i].second);
  91. ans.push_back(v[i + 1].second);
  92. i += 2;
  93. }
  94. }
  95. }
  96. cout << endl;
  97. }
  98.  
  99. int main() {
  100. AboRadwan;
  101. int t = 1;
  102. // cin >> t;
  103. while (t--) {
  104. solve();
  105. }
  106. return 0;
  107. }
  108.  
Success #stdin #stdout 0.01s 5312KB
stdin
Standard input is empty
stdout