Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. # include <cstdio>
  2. # include <queue>
  3. # include <cmath>
  4. # include <iostream>
  5. # include <vector>
  6. # include <cstdlib>
  7. # include <ctime>
  8. # include <algorithm>
  9. # include <utility>
  10. using namespace std;
  11.  
  12.  
  13. /*
  14. 1. структура для кучи отрезок + макс
  15. 2. приориту кью
  16. 3. segment_tree с возвратом максимума на отрезке
  17. 4. класс suggest
  18.  
  19. */
  20.  
  21. struct NumberOfRequests
  22. {
  23.     int count;
  24.     int i;
  25. }
  26.  
  27. struct heap {
  28.     int left;
  29.     NumberOfRequests max;
  30.     int right;
  31.  
  32.     bool operator < (const heap &a) const
  33.     {
  34.         return max.count < a.max.count;
  35.     }
  36.     bool operator > (const heap &a) const
  37.     {
  38.         return max.count > a.max.count;
  39.     }
  40.     bool operator == (const heap &a) const
  41.     {
  42.         return max.count ==a.max.count;
  43.     }
  44. }
  45.  
  46. class SegmentTree {
  47.     vector <NumberOfRequests> tree;
  48.     int size;
  49.     NumberOfRequests _subMax (int v, int L, int R, int l, int r) // L и R это за какой отрезок отвечает v; l и r - запрос
  50.     {
  51.         NumberOfRequests answer;
  52.         answer.count = 0;
  53.         answer.i = - 1;
  54.         if (l > r) return answer;
  55.         if (l == L && r == R)
  56.         {
  57.             tree[v].i = v - size + 1;
  58.             return tree[v];
  59.         }
  60.         return max (_subMax(2 * v + 1, L, (L + R) / 2, l, min(r, (L+R) / 2)),
  61.                     _subMax(2 * v + 2, (L + R)/ 2 + 1, R, max(l, (L+R) / 2 + 1), r));
  62.     }
  63.  
  64.     public :
  65.     SegmentTree (const vector <NumberOfRequests > &a)
  66.     {
  67.         for (size = 1; size < a.size(); size *= 2);
  68.         int tmp = size;
  69.         NumberOfRequests answer;
  70.         answer.count = 0;
  71.         answer.i = - 1;
  72.         tree.assign(2 * size - 1, answer);
  73.         for (int i = 0; i < a.size(); i++)
  74.         {
  75.             tree[size - 1 + i].count = a[i].count;
  76.             tree[size - 1 + i].i = i;
  77.         }
  78.  
  79.         for (int i = size - 2; i >= 0; i--)
  80.             tree[i] = max(tree[2 * i + 1], tree[2 * i + 2]);
  81.         size = tmp;
  82.     }
  83.  
  84.     NumberOfRequests subMax(int l, int r)
  85.     {
  86.         return _subMax(0, 0, size - 1, l, r);
  87.     }
  88.  
  89.  
  90. }
  91.  
  92. class Suggest {
  93.     vector <NumberOfRequests > tree;
  94.     vector <int> answer_number;
  95.     priority_queue <heap> q;
  96.     vector <pair <string, int> > data;
  97.  
  98.     Suggest (const vector <pair <string, int> > &array)
  99.     {
  100.         data = vector <pair < string, int> > (array.begin(), array.end());
  101.         sort(data.begin(), data.end());
  102.         int l = data.size();
  103.         for (int i = 0; i < l; i++)
  104.         {
  105.             tree[i].i = i;
  106.             tree[i].count = data[i].second;
  107.         }
  108.         SegmentTree ST(tree); //// &
  109.     }
  110.     void Request (string& s, int counter, vector <int> &answer_number)
  111.     {
  112.         vector<pair <string, int> >::iterator li, ri;
  113.         li = lower_bound(data.begin(), data.end(), make_pair(s, 0));
  114.         ri = upper_bound(data.begin(), data.end(), make_pair(s, 100000000));
  115.         int l = li - data.begin();
  116.         int r = ri - data.begin();
  117.         r--;
  118.         heap tmp;
  119.         void fillingHeap (int left, int right, int counter)
  120.         {
  121.             if (l > r || counter == 0) return;
  122.             /*if (!q.empty)
  123.             {
  124.                 tmp = q.top()
  125.                 answer_number.push_back(tmp.max.i)
  126.                 q.pop();
  127.             }*/
  128.             tmp.left = l;
  129.             tmp.max = ST.subMax(l, r);
  130.             tmp.right = r;
  131.             q.push(tmp);
  132.             fillingHeap(l, maximum.second - 1, counter - 1);
  133.             fillingHeap(maximum.second + 1, r, counter - 1);
  134.         }
  135.         for (int i = 0; i < counter && !q.empty(); i++)
  136.         {
  137.             tmp = q.top();
  138.             answer_number.push_back(tmp.max.i);
  139.             q.pop();
  140.  
  141.         }
  142.     }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement