Advertisement
a53

BigNumber

a53
Dec 31st, 2016
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. #define TuTTy "Cosmin-Mihai Tutunaru"
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5. #define infile "bignumber.in"
  6. #define outfile "bignumber.out"
  7. #define nmax 1000013
  8. #define ll long long
  9.  
  10. using namespace std;
  11.  
  12. int cnt[10];
  13. int untestable[10];
  14.  
  15. vector<char> v; //the initial string
  16. vector<char> w; //sorted version of w
  17. vector<char> z; //used by getCost and moveLeft
  18. int n, x;
  19.  
  20. void read() {
  21. scanf("%d %d\n", &n, &x);
  22. for (int i = 0; i < n; ++i) {
  23. char c;
  24. scanf("%c", &c);
  25. v.push_back(c);
  26. }
  27. }
  28.  
  29. void printVector(vector<char> str) {
  30. for (size_t i = 0; i < str.size(); ++i) {
  31. printf("%c", str[i]);
  32. }
  33.  
  34. printf("\n");
  35. }
  36.  
  37. int getFirstPosAfter(int pos, int va) {
  38. for (int i = pos+1; i < n; ++i) {
  39. if (z[i] - '0' == va) {
  40. return i;
  41. }
  42. }
  43.  
  44. return -1;
  45. }
  46.  
  47. ll moveLeft(int pos, char c, int no) {
  48. ll cost = 0;
  49. int cnt = 0;
  50.  
  51. for (int i = pos; i < (int)z.size(); ++i) {
  52. if (z[i] == c) {
  53. ++cnt;
  54. }
  55.  
  56. if (cnt == no) {
  57. cnt = 0;
  58. for (int j = i; j >= pos; --j) {
  59. if (z[j] == c) {
  60. ++cnt;
  61. } else {
  62. z[j+cnt] = z[j];
  63. cost += cnt;
  64. }
  65. }
  66.  
  67. for (int j = 0; j < no; ++j) {
  68. z[pos+j] = c;
  69. }
  70.  
  71. break;
  72. }
  73. }
  74.  
  75. return cost;
  76. }
  77.  
  78. ll getCost(int no) {
  79. ll cost = 0;
  80. z = v;
  81.  
  82. for (int i = 0; i < no+1; ++i) {
  83. int pos = min(no + 1, i + cnt[w[i] - '0']);
  84. cost += moveLeft(i, w[i], pos - i);
  85. i = pos - 1;
  86. }
  87.  
  88. return cost;
  89. }
  90.  
  91. void solve() {
  92. for (size_t i = 0; i < v.size(); ++i) {
  93. cnt[v[i]-'0']++;
  94. }
  95.  
  96. w = v;
  97. sort(w.begin(), w.end());
  98. reverse(w.begin(), w.end());
  99.  
  100. int le = 0, ri = n-1, best = -1;
  101.  
  102. while(le <= ri) {
  103. int mi = (le+ri) / 2;
  104. if (getCost(mi) <= x) {
  105. best = mi, le = mi+1;
  106. } else {
  107. ri = mi - 1;
  108. }
  109. }
  110.  
  111. if (best >= 0) {
  112. x -= getCost(best);
  113. } else {
  114. z = v;
  115. }
  116.  
  117. for (int i = 0; i < best+1; ++i) {
  118. cnt[z[i] - '0']--;
  119. }
  120.  
  121. for (int i = best+1; i < n && x; ++i) {
  122. for (int va = 9; va > z[i] - '0' && x; --va) {
  123. if (!cnt[va] || untestable[va] > i) {
  124. continue;
  125. }
  126.  
  127. int pos = getFirstPosAfter(i, va);
  128.  
  129. if (pos > i && pos - i <= x) {
  130. x -= pos - i;
  131.  
  132. for (int j = pos - 1; j >= i; --j) {
  133. z[j+1] = z[j];
  134. }
  135.  
  136. z[i] = va + '0';
  137. } else {
  138. untestable[va] = x - (pos-1) - 1;
  139. }
  140. }
  141.  
  142. cnt[z[i] - '0']--;
  143. }
  144. }
  145.  
  146. void write() {
  147. printVector(z);
  148. }
  149.  
  150. int main() {
  151. freopen(infile, "r", stdin);
  152. freopen(outfile, "w", stdout);
  153.  
  154. read();
  155. solve();
  156. write();
  157.  
  158. fclose(stdin);
  159. fclose(stdout);
  160. return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement