Advertisement
den4ik2003

Untitled

Jul 25th, 2022
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using std::cin;
  5. using std::cout;
  6. const long long SIZE = 1e6;
  7. long long pointer[SIZE]; //polong longer[i] содержит номер вершины где сейчас находится элемент добавленный на i-м запрсосе
  8. long long num[SIZE]; //num[v] - говорит на каком шаге была добавлена вершина
  9.  
  10. //строим кучу так что число в вершине не превосходит чисел в его поддереве
  11. //использую 1-нумерацию
  12.  
  13. void Reverse(long long u, long long v) { //функция свапает две вершины с учётом num и polong longer
  14.     long long k = num[u];
  15.     long long m = num[v];
  16.     std::swap(num[u], num[v]);
  17.     std::swap(pointer[k], pointer[m]);
  18.    
  19.     /*std::swap(num[u], num[v]);
  20.     pointer[num[u]] = v;
  21.     pointer[num[v]] = u; */
  22. }
  23.  
  24. void SiftUp(std::vector<long long> &a, long long v) { //поднимает число на нужное место
  25.     while (v != 1) {
  26.         if (a[v] < a[v/2]) {
  27.             Reverse(v, v / 2);
  28.             std::swap(a[v], a[v/2]);
  29.             v /= 2;
  30.         }
  31.         else {
  32.             break;
  33.         }
  34.     }
  35. }
  36.  
  37. void SiftDown(std::vector<long long> &a, long long v) {
  38.     long long n = a.size() - 1;
  39.     while (2*v <= n) { //условие существования ребёнка
  40.         long long u = 2*v;
  41.         if (2*v + 1 <= n && a[2*v + 1] < a[2*v]) {
  42.             u = 2*v + 1;
  43.         }
  44.         if (a[u] < a[v]) {
  45.             Reverse(u, v);
  46.             std::swap(a[u], a[v]);
  47.             v = u;
  48.         }
  49.         else {
  50.             break;
  51.         }
  52.     }
  53. }
  54.  
  55. long long getMin(std::vector<long long> &a) {
  56.     return a[1];
  57. }
  58.  
  59. void Insert(std::vector<long long> &a, long long x, long long i) {
  60.     long long n = a.size() - 1;
  61.     a.push_back(x);
  62.     pointer[i] = n + 1;
  63.     num[n + 1] = i;
  64.     SiftUp(a, n + 1);
  65. }
  66.  
  67. void ExtractMin(std::vector<long long> &a) {
  68.     long long n = a.size() - 1;
  69.     Reverse(1, n);
  70.     std::swap(a[1], a[n]);
  71.     a.pop_back();
  72.     SiftDown(a, 1);
  73. }
  74.  
  75. void DecreaseKey(std::vector<long long> &a, long long i, long long delta) {
  76.     a[pointer[i]] -= delta;
  77.     SiftUp(a, pointer[i]);
  78. }
  79.  
  80.  
  81. int main() {
  82.     std::ios_base::sync_with_stdio(false);
  83.     std::cin.tie(NULL);
  84.  
  85.     long long q;
  86.     cin >> q;
  87.  
  88.     std::vector<long long> a; //будет хранить число хранящееся в i-й вершине
  89.     a.push_back(0); //этот элемент нужен для 1-нумерация
  90.     std::string s;
  91.     for (long long i = 1; i <= q; i++) {
  92.         cin >> s;
  93.         if (s == "insert") {
  94.             long long x;
  95.             cin >> x;
  96.             Insert(a, x, i);
  97.         }
  98.         if (s == "getMin") {
  99.             long long temp = getMin(a);
  100.             cout << temp << "\n";
  101.         }
  102.         if (s == "extractMin") {
  103.             ExtractMin(a);
  104.         }
  105.         if (s == "decreaseKey") {
  106.             long long j, delta;
  107.             cin >> j >> delta;
  108.             DecreaseKey(a, j, delta);
  109.         }
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement