matheus_monteiro

Pietra - Code - Frações

Jun 11th, 2021 (edited)
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4.  
  5. struct frac {
  6.    int n, d;
  7.    
  8.    void simplify() {
  9.       int g = __gcd(n, d);
  10.       n /= g; d /= g;
  11.    }
  12.    
  13.    void printtt() {
  14.       cout << n << '/' << d << "\n";
  15.    }
  16.  
  17.    frac() {}
  18.    frac(int _n, int _d) : n(_n), d(_d) { simplify(); }
  19.    
  20. };
  21.  
  22. bool operator<(const frac &a, const frac &b) {
  23.    return a.n * b.d < b.n * a.d;
  24. }
  25.  
  26. frac operator+(const frac &a, const frac &b) {
  27.    frac f = frac( a.n * b.d + b.n * a.d, a.d * b.d );
  28.    f.simplify();
  29.    return f;
  30. }
  31.  
  32. frac operator/(const frac &a, int d) {
  33.    frac r = frac(a.n, a.d * d);
  34.    r.simplify();
  35.    return r;
  36. }
  37.  
  38. int n, X, z, last;
  39.  
  40. int32_t main() {
  41.     ios_base::sync_with_stdio(false);
  42.     cin.tie(nullptr);
  43.    
  44.    cin >> n >> X >> z >> last;
  45.    
  46.    priority_queue<pair<frac, frac>> intervals;
  47.  
  48.    for(int i = 1; i < n; i++)  {
  49.       int cur;
  50.       cin >> cur;
  51.       frac f(cur - last, 1);
  52.       frac s(-last, 1);
  53.       intervals.push({f, s}); // {size, start}
  54.       last = cur;
  55.    }
  56.  
  57.    vector<pair<int, int>> query(z);
  58.  
  59.    for(int i = 0; i < z; i++) {
  60.       int k;
  61.       cin >> k;
  62.       query.push_back({k, i});
  63.    }
  64.  
  65.    sort(query.begin(), query.end());
  66.  
  67.    vector<frac> ans(z);
  68.    int cnt = 0;
  69.  
  70.    for(auto [k, i] : query) {
  71.  
  72.       while(cnt < k) {
  73.  
  74.          auto [f, s1] = intervals.top();
  75.          intervals.pop();
  76.          
  77.          f = f / 2;
  78.  
  79.          s1.n *= -1;
  80.          frac s2 = s1 + f;
  81.  
  82.          ans[i] = s2;
  83.  
  84.          s1.n *= -1;
  85.          s2.n *= -1;
  86.  
  87.          intervals.push({f, s1});
  88.          intervals.push({f, s2});
  89.  
  90.          cnt++;
  91.       }
  92.  
  93.    }
  94.    for(int i = 0; i < z; i++)
  95.       ans[i].printtt();
  96.  
  97.     return 0;
  98. }
  99.  
Add Comment
Please, Sign In to add comment