Advertisement
Guest User

Untitled

a guest
Jan 21st, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.07 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  HW3_E
  4. //
  5. //  Created by Антон Трубаков on 04/01/2018.
  6. //  Copyright © 2018 Антон Трубаков. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <string>
  11. #include <vector>
  12. #include <random>
  13. #include <cmath>
  14. #include <algorithm>
  15.  
  16. using std::cin;
  17. using std::cout;
  18. using std::endl;
  19. using std::string;
  20. using std::vector;
  21. using std::swap;
  22. using std::sort;
  23.  
  24. typedef long long ll;
  25.  
  26.  
  27.  
  28. struct HeapElem {
  29.     HeapElem() {};
  30.     HeapElem(ll elem, size_t initialPos) : elem(elem), initialPos(initialPos) {};
  31.     ll elem;
  32.     size_t initialPos;
  33. };
  34.  
  35. class Solution {
  36. public:
  37.     Solution(vector<ll> arr, ll size, ll kk) : arr(arr), kk(kk) {
  38.         HeapElem interm(-1, -1);
  39.         smallestKNumbers.resize(kk + 1, interm);
  40.         interm.elem = 2000000000;
  41.         otherNumbers.resize(size, interm);
  42.         positions.resize(size, 0);
  43.         whichHeap.resize(size, 0);
  44.         size_K = 0;
  45.         size_O = 0;
  46.         Add(smallestKNumbers, size_K, compareK, arr[0], 0);
  47.         whichHeap[0] = 1;
  48.         positions[0] = 0;
  49.     }
  50.    
  51.     ll Left(size_t pos) {
  52.         Delete(pos);
  53.         if (size_K < kk && size_O > 0) {
  54.             HeapElem head = otherNumbers[0];
  55.             Delete(head.initialPos);
  56.             whichHeap[head.initialPos] = 1;
  57.             Add(smallestKNumbers, size_K, compareK, head.elem, head.initialPos);
  58.         }
  59.         if (size_K == kk) {
  60.             return smallestKNumbers[0].elem;
  61.         } else {
  62.             return -1;
  63.         }
  64.     }
  65.    
  66.     ll Right(size_t pos) {
  67.         whichHeap[pos] = 1;
  68.         Add(smallestKNumbers, size_K, compareK, arr[pos], pos);
  69.         if (size_K > kk) {
  70.             HeapElem head = smallestKNumbers[0];
  71.             Delete(head.initialPos);
  72.             whichHeap[head.initialPos] = 2;
  73.             Add(otherNumbers, size_O, compareO, head.elem, head.initialPos);
  74.         }
  75.         if (size_K == kk) {
  76.             return smallestKNumbers[0].elem;
  77.         } else {
  78.             return -1;
  79.         }
  80.     }
  81.    
  82. private:
  83.     void Add(vector<HeapElem>& heap, ll& size,
  84.              int (*compare)(HeapElem, HeapElem), ll elem, size_t pos) {
  85.         HeapElem newElem(elem, pos);
  86.         size += 1;
  87.         heap[size - 1] = newElem;
  88.         positions[pos] = size - 1;
  89.         siftUp(heap, size, compare, size - 1);
  90.     }
  91.    
  92.     void Delete(ll pos) {
  93.         if (whichHeap[pos] == 1) {
  94.             remove(smallestKNumbers, size_K, compareK, positions[pos]);
  95.         } else if (whichHeap[pos] == 2) {
  96.             remove(otherNumbers, size_O, compareO, positions[pos]);
  97.         }
  98.         positions[pos] = 0;
  99.         whichHeap[pos] = 0;
  100.     }
  101.    
  102.     void siftUp(vector<HeapElem>& heap, ll& size, int (*compare)(HeapElem, HeapElem), ll pos) {
  103.         while (compare(heap[pos], heap[(pos - 1) / 2])) {
  104.             smartSwap(heap, pos, (pos - 1) / 2);
  105.             pos = (pos - 1) / 2;
  106.         }
  107.     }
  108.    
  109.     void siftDown(vector<HeapElem>& heap, ll& size, int (*compare)(HeapElem, HeapElem), ll pos) {
  110.         while (2 * pos + 1 < size) {
  111.             ll left = 2 * pos + 1;
  112.             ll right = 2 * pos + 2;
  113.             ll next = left;
  114.             if (right < size and compare(heap[right], heap[left])) {
  115.                 next = right;
  116.             }
  117.             if (compare(heap[pos], heap[next]) || heap[pos].elem == heap[next].elem) {
  118.                 break;
  119.             }
  120.             smartSwap(heap, pos, next);
  121.             pos = next;
  122.         }
  123.     }
  124.    
  125.     void remove(vector<HeapElem>& heap, ll& size, int (*compare)(HeapElem, HeapElem), size_t pos) {
  126.         smartSwap(heap, pos, size - 1);
  127.         size -= 1;
  128.         size_t initPos = heap[pos].initialPos;
  129.         siftDown(heap, size, compare, pos);
  130.         siftUp(heap, size, compare, positions[initPos]);
  131.     }
  132.    
  133.     void smartSwap(vector<HeapElem>& heap, size_t first_pos, size_t second_pos) {
  134.         swap(whichHeap[heap[first_pos].initialPos], whichHeap[heap[second_pos].initialPos]);
  135.         swap(positions[heap[first_pos].initialPos], positions[heap[second_pos].initialPos]);
  136.         swap(heap[first_pos].elem, heap[second_pos].elem);
  137.         swap(heap[first_pos].initialPos, heap[second_pos].initialPos);
  138.     }
  139.    
  140.     static int compareK(HeapElem first, HeapElem second) {
  141.         return first.elem > second.elem;
  142.     }
  143.    
  144.     static int compareO(HeapElem first, HeapElem second) {
  145.         return first.elem < second.elem;
  146.     }
  147.    
  148.     vector<ll> arr;
  149.     vector<HeapElem> smallestKNumbers;
  150.     vector<HeapElem> otherNumbers;
  151.     vector<size_t> positions;
  152.     vector<ll> whichHeap; // 0 - no heap, 1 - smallestK, 2 - other
  153.     ll size_K;
  154.     ll size_O;
  155.     ll kk;
  156. };
  157.  
  158. // ll naive_answer(vector<ll> elems, size_t left, size_t right, ll kk) {
  159. //    if (right - left + 1< kk) {
  160. //        return -1;
  161. //    } else {
  162. //        sort(elems.begin() + left, elems.begin() + right + 1);
  163. //        return elems[left + kk - 1];
  164. //    }
  165. // }
  166.  
  167. // void test() {
  168. //    size_t amount = 100;
  169. //    size_t opers = 198;
  170. //    ll kk = 4;
  171. //    vector<ll> elems(amount);
  172. //    vector<ll> operations(opers, 0);
  173. //    for (size_t i = 0; i < amount; ++i) {
  174. //        elems[i] = rand() % 100000;
  175. //    }
  176. //    for (size_t i = 0; i < amount - 1; ++i) {
  177. //        operations[i] = 1;
  178. //    }
  179. //    vector<ll> answers;
  180. //    vector<ll> naive_answers;
  181. //    Solution sol(elems, amount, kk);
  182. //    ll left = 0, right = 0;
  183. //    for (size_t i = 0; i < opers; ++i) {
  184. //        if (operations[i] == 1) {
  185. //            ++right;
  186. //            answers.push_back(sol.Right(right));
  187. //            naive_answers.push_back(naive_answer(elems, left, right, kk));
  188. //        } else {
  189. //            answers.push_back(sol.Left(left));
  190. //            ++left;
  191. //            naive_answers.push_back(naive_answer(elems, left, right, kk));
  192. //        }
  193. //    }
  194. //    cout << "My answers: \n";
  195. //    for (size_t i = 0; i < answers.size(); ++i) {
  196. //        cout << answers[i] << " ";
  197. //    }
  198. //    cout << endl;
  199. //    cout << "Naive answers: \n";
  200. //    for (size_t i = 0; i < answers.size(); ++i) {
  201. //        cout << naive_answers[i] << " ";
  202. //    }
  203. //    cout << endl;
  204. //    for (size_t i = 0; i < answers.size(); ++i) {
  205. //        if (naive_answers[i] != answers[i]) {
  206. //            cout << "ERROR" << endl;
  207. //            cout << "My answers: \n";
  208. //            for (size_t i = 0; i < answers.size(); ++i) {
  209. //                cout << answers[i] << " ";
  210. //            }
  211. //            cout << endl;
  212. //            cout << "Naive answers: \n";
  213. //            for (size_t i = 0; i < answers.size(); ++i) {
  214. //                cout << naive_answers[i] << " ";
  215. //            }
  216. //            cout << endl;
  217. //            cout << "Initial vector: \n";
  218. //            for (size_t i = 0; i < amount; ++i) {
  219. //                cout << elems[i] << " ";
  220. //            }
  221. //            cout << endl;
  222. //        }
  223. //    }
  224. // }
  225.  
  226. int main(int argc, const char * argv[]) {
  227.     size_t amount, opers;
  228.     ll kk;
  229.     cin >> amount >> opers >> kk;
  230.     vector<ll> elems(amount);
  231.     for (size_t i = 0; i < amount; ++i) {
  232.         cin >> elems[i];
  233.     }
  234.     vector<ll> operations(opers);
  235.     for (size_t i = 0; i < opers; ++i) {
  236.         char ch;
  237.         cin >> ch;
  238.         if (ch == 'R') {
  239.             operations[i] = 1;
  240.         } else {
  241.             operations[i] = -1;
  242.         }
  243.     }
  244.     Solution sol(elems, amount, kk);
  245.     ll left = 0, right = 0;
  246. //    vector<ll> naive_answers;
  247.     for (size_t i = 0; i < opers; ++i) {
  248.         if (operations[i] == 1) {
  249.             ++right;
  250.             cout << sol.Right(right) << " ";
  251. //            naive_answers.push_back(naive_answer(elems, left, right, kk));
  252.         } else {
  253.             cout << sol.Left(left) << " ";
  254.             ++left;
  255. //            naive_answers.push_back(naive_answer(elems, left, right, kk));
  256.         }
  257.     }
  258. //    cout << "\nNaive answers: \n";
  259. //    for (size_t i = 0; i < naive_answers.size(); ++i) {
  260. //        cout << naive_answers[i] << " ";
  261. //    }
  262. //    cout << endl;
  263. //    for (int i = 0; i < 10000; ++i) {
  264. //        test();
  265. //    }
  266.     return 0;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement