Dang_Quan_10_Tin

HSGO 2020 TRAFFIC

May 4th, 2022 (edited)
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using ll = long long;
  5. using ld = long double;
  6.  
  7. constexpr int N = 1e5 + 5;
  8. constexpr ld eps = 1e-12;
  9. int n, b[N], c[N], d[N];
  10. int pos[N], id[N];
  11. ll k;
  12.  
  13. struct FenwickTree
  14. {
  15.     int n;
  16.     int a[N];
  17.  
  18.     FenwickTree()
  19.     {
  20.         memset(a, 0, sizeof a);
  21.     }
  22.  
  23.     void Assgin(int n)
  24.     {
  25.         this->n = n;
  26.         memset(a, 0, sizeof a);
  27.     }
  28.  
  29.     void Update(int p, int v)
  30.     {
  31.         for (; p <= n; p += p & -p)
  32.             a[p] += v;
  33.     }
  34.  
  35.     int Get(int p)
  36.     {
  37.         int ans(0);
  38.  
  39.         for (; p; p -= p & -p)
  40.             ans += a[p];
  41.  
  42.         return ans;
  43.     }
  44. } f;
  45.  
  46. struct Traffic
  47. {
  48.     int id;
  49.     ll x, v;
  50. } a[N];
  51.  
  52. vector<ld> sx;
  53.  
  54. void Read()
  55. {
  56.     cin >> n >> k;
  57.  
  58.     for (int i = 1; i <= n; ++i)
  59.     {
  60.         cin >> a[a[i].id = i].x >> a[id[i] = i].v;
  61.         a[i].x *= 10000000;
  62.         a[i].v *= 10000000;
  63.     }
  64. }
  65.  
  66. #define Find(x, v) (lower_bound(x.begin(), x.end(), (v)) - x.begin() + 1)
  67.  
  68. ll Get(ld t)
  69. {
  70.     sort(id + 1, id + n + 1, [&](const int &x, const int &y)
  71.          { return a[x].x + a[x].v * t < a[y].x + a[y].v * t; });
  72.  
  73.     int m = 0;
  74.     for (int i = 1, j = 1; i <= n; ++i)
  75.     {
  76.         ++m;
  77.         while (j <= n && a[id[i]].x + a[id[i]].v * t == a[id[j]].x + a[id[j]].v * t)
  78.             ++j;
  79.  
  80.         while (i < j)
  81.             pos[id[i++]] = m;
  82.  
  83.         --i;
  84.     }
  85.  
  86.     f.Assgin(m);
  87.  
  88.     ll ans(0);
  89.  
  90.     for (int i = 1, j = 1; i <= n; ++i)
  91.     {
  92.         while (j <= n && a[i].v == a[j].v)
  93.             ++j;
  94.  
  95.         for (int h = i; h < j; ++h)
  96.             ans += (b[h] = f.Get(pos[h])) - d[h];
  97.  
  98.         for (int h = i; h < j; ++h)
  99.             f.Update(pos[h], 1);
  100.  
  101.         i = j - 1;
  102.     }
  103.  
  104.     return ans;
  105. }
  106.  
  107. void Search(ld t)
  108. {
  109.     int piv = 0;
  110.     for (int i = n; i; --i)
  111.         if (b[i] != c[i])
  112.         {
  113.             piv = i;
  114.             break;
  115.         }
  116.  
  117.     pair<ld, int> ans = {0, 0};
  118.  
  119.     for (int i = 1; a[i].v != a[piv].v; ++i)
  120.         if (a[i].x >= a[piv].x && a[i].x + a[i].v * t <= a[piv].x + a[piv].v * t)
  121.             ans = max(ans, make_pair((ld)1.0 * (a[i].x - a[piv].x) / (a[piv].v - a[i].v), i));
  122.  
  123.     cout << min(a[ans.second].id, a[piv].id) << " " << max(a[ans.second].id, a[piv].id);
  124. }
  125.  
  126. void Print(int a[N])
  127. {
  128.     return;
  129.     for (int i = 1; i <= n; ++i)
  130.         cerr << a[i] << " ";
  131.     cerr << "\n";
  132. }
  133.  
  134. void Solve()
  135. {
  136.     sort(a + 1, a + n + 1, [&](const Traffic &a, const Traffic &b)
  137.          { return a.v < b.v; });
  138.     {
  139.         Get(0);
  140.  
  141.         for (int i = 1; i <= n; ++i)
  142.             d[i] = b[i];
  143.     }
  144.     {
  145.         ld l = 0, m, h = 2e6;
  146.  
  147.         while (h - l >= eps)
  148.         {
  149.             m = (l + h) / 2;
  150.  
  151.             if (Get(m) < k - 1)
  152.                 l = m;
  153.             else
  154.                 h = m;
  155.         }
  156.         Get(h);
  157.  
  158.         for (int i = 1; i <= n; ++i)
  159.             c[i] = b[i];
  160.     }
  161.     {
  162.         ld l = 0, m, h = 2e6;
  163.  
  164.         while (h - l >= eps)
  165.         {
  166.             m = (l + h) / 2;
  167.  
  168.             if (Get(m) < k)
  169.                 l = m;
  170.             else
  171.                 h = m;
  172.         }
  173.         Get(h);
  174.         Search(h);
  175.     }
  176. }
  177.  
  178. int32_t main()
  179. {
  180.     ios::sync_with_stdio(0);
  181.     cin.tie(0);
  182.     cout.tie(0);
  183.     Read();
  184.     Solve();
  185. }
  186.  
Add Comment
Please, Sign In to add comment