Advertisement
vlatkovski

meetings.cpp

Feb 11th, 2020
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1.  
  2. // Problem : Problem 2. Meetings
  3. // Contest : USACO 2019 December Contest, Silver
  4. // URL : http://usaco.org/index.php?page=viewproblem2&cpid=967
  5. // Memory Limit : 256 MB
  6. // Time Limit : 4000 ms
  7. // Powered by CP Editor (https://github.com/coder3101/cp-editor)
  8.  
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13.  
  14.  
  15. typedef tuple<int, int, int> Cow;
  16.  
  17. bool Compare(const Cow& a, const Cow& b) {
  18.     return get<0>(a) < get<0>(b);
  19. }
  20.  
  21.  
  22. int main() {
  23.     ios::sync_with_stdio(false);
  24.     cin.tie(0);
  25.     #ifndef _DEBUG
  26.     freopen("meetings.in", "r", stdin);
  27.     freopen("meetings.out", "w", stdout);
  28.     #endif
  29.     int N, L;
  30.     cin >> N >> L;
  31.     vector<Cow> cows;
  32.     int totw = 0;
  33.     for (int i = 0; i < N; ++i) {
  34.         int w, x, d;
  35.         cin >> w >> x >> d;
  36.         cows.emplace_back(x, w, d);
  37.         totw += w;
  38.     }
  39.     int lo = 0, hi = L, mid, T = L+1;
  40.     while (lo <= hi) {
  41.         mid = (lo + hi) / 2;
  42.         int numL = 0, numR = 0;
  43.         for (auto& cow : cows) {
  44.             int x = get<0>(cow);
  45.             int d = get<2>(cow);
  46.             if (d == -1 && x-mid <= 0) {
  47.                 ++numL;
  48.             } else if (d == 1 && x+mid >= L) {
  49.                 ++numR;
  50.             }
  51.         }
  52.         int sumw = 0;
  53.         for (int i = 0; i < numL; ++i) {
  54.             sumw += get<1>(cows[i]);
  55.         }
  56.         for (int i = N-1; i >= N-numR; --i) {
  57.             sumw += get<1>(cows[i]);
  58.         }
  59.         if (2*sumw >= totw) {
  60.             T = mid;
  61.             hi = mid-1;
  62.         } else {
  63.             lo = mid+1;
  64.         }
  65.     }
  66.     //cout << "T="<<T<<endl;
  67.     ll ans = 0;
  68.     // left to right
  69.     sort(cows.begin(), cows.end(), Compare);
  70.     int cnt = 0; // cnt to the left, going right
  71.     int j = 0;
  72.     for (int i = 0; i < N; ++i) {
  73.         if (get<2>(cows[i]) == 1) {
  74.             ++cnt;
  75.             continue;
  76.         }
  77.         int minokx = get<0>(cows[i]) - 2*T;
  78.         while (j < i && get<0>(cows[j]) < minokx) {
  79.             if (get<2>(cows[j]) == 1) {
  80.                 --cnt;
  81.             }
  82.             ++j;
  83.         }
  84.         ans += cnt;
  85.     }
  86.     cnt = 0;
  87.     j = N-1;
  88.     for (int i = N-1; i >= 0; --i) {
  89.         if (get<2>(cows[i]) == -1) {
  90.             ++cnt;
  91.             continue;
  92.         }
  93.         int maxokx = get<0>(cows[i]) + 2*T;
  94.         while (j > i && get<0>(cows[j]) > maxokx) {
  95.             if (get<2>(cows[j]) == -1) {
  96.                 --cnt;
  97.             }
  98.             --j;
  99.         }
  100.         ans += cnt;
  101.     }
  102.     ans /= 2;
  103.     cout << ans << '\n';
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement