Advertisement
tepyotin2

P86_Meeting

Aug 1st, 2023
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. bool isDiag = false;
  5. int N, L;
  6. struct Cow{
  7.     int w, x, d;
  8.     Cow(){};
  9.     Cow(int w, int x, int d):w(w), x(x), d(d){}
  10. };
  11.  
  12. int get_time(vector<Cow> cows){
  13.     vector<int> leftCows, rightCows;
  14.    
  15.     int total_w = 0;
  16.     for (Cow cow: cows)
  17.     {
  18.         if (cow.d == -1)
  19.         {
  20.             leftCows.push_back(cow.x);
  21.         }else
  22.         {
  23.             rightCows.push_back(L - cow.x);
  24.         }
  25.         total_w += cow.w;
  26.     }
  27.    
  28.     vector<pair<int, int>> f;
  29.     for (int i = 0; i < leftCows.size(); i++)
  30.     {
  31.         f.push_back({leftCows[i], cows[i].w});
  32.     }
  33.    
  34.     for (int i = 0; i < rightCows.size(); i++)
  35.     {
  36.         f.push_back({rightCows[i], cows[leftCows.size()+i].w});
  37.     }
  38.     sort(f.begin(), f.end());
  39.    
  40.     int sum = 0;
  41.     for (int i = 0; i < f.size(); i++)
  42.     {
  43.         sum += f[i].second;
  44.         if(isDiag)cout << "pos: " << f[i].first << ", weight: " << f[i].second <<", sum: " << sum << ", total_weight: " << total_w<< endl;
  45.         //if ((sum * 2) > total_w) !!!problem cause invalid result for case 2 & 3
  46.         if ((sum * 2) >= total_w)
  47.         {
  48.             return f[i].first;
  49.         }
  50.     }
  51.    
  52.    
  53.     return 0;
  54. }
  55. int main(){
  56.     //isDiag = true;
  57.     if (isDiag)
  58.     {
  59.         freopen("meetings_silver_dec19/2.in", "r", stdin);
  60.         //freopen("meeting.in", "r", stdin);
  61.     }else{
  62.         freopen("meetings.in", "r", stdin);
  63.     }
  64.    
  65.     cin >> N >> L;
  66.    
  67.     vector<Cow> cows(N);
  68.     for (int i = 0; i < N; i++)
  69.     {
  70.         cin >> cows[i].w >> cows[i].x >> cows[i].d;
  71.     }
  72.     sort(cows.begin(), cows.end(), [](Cow a, Cow b){
  73.         return a.x < b.x;
  74.     });
  75.    
  76.     int t = get_time(cows);
  77.    
  78.     vector<int> leftCows, rightCows;
  79.    
  80.     for (Cow cow: cows)
  81.     {
  82.         if (cow.d == -1)
  83.         {
  84.             leftCows.push_back(cow.x);
  85.         }else
  86.         {
  87.             rightCows.push_back(cow.x);
  88.         }
  89.     }
  90.    
  91.    
  92.     if(isDiag) cout << "t: " << t << endl;
  93.     //if (isDiag)
  94.     //{
  95.         //cout << "right cows: >> " ;
  96.         //for (int i = 0; i < rightCows.size(); i++)
  97.         //{
  98.             //cout << rightCows[i] << ", ";
  99.         //}
  100.         //cout << endl;
  101.     //}
  102.     int ans = 0;
  103.     //for (int i = 0; i < leftCows.size(); i++)
  104.     //{
  105.         //int start = lower_bound(rightCows.begin(), rightCows.end(), leftCows[i] - (2*t) ) - rightCows.begin();
  106.         //int end = lower_bound(rightCows.begin(), rightCows.end(), leftCows[i] ) - rightCows.begin();
  107.        
  108.         //ans += end - start;
  109.         //if(isDiag) cout << "i: " << i << ", leftCows: " << leftCows[i]  <<", check begin: " << leftCows[i] - (2*t)<< ", start: " << start << ", end: " << end << endl;
  110.     //}
  111.    
  112.     if (isDiag)
  113.     {
  114.         cout << "left cows: >> " ;
  115.         for (int i = 0; i < leftCows.size(); i++)
  116.         {
  117.             cout << leftCows[i] << ", ";
  118.         }
  119.         cout << endl;
  120.     }
  121.    
  122.     for (int i = 0; i < rightCows.size(); i++)
  123.     {
  124.         int start =  upper_bound(leftCows.begin(), leftCows.end(), rightCows[i] ) - leftCows.begin();
  125.         int end = upper_bound(leftCows.begin(), leftCows.end(), rightCows[i] +(2*t) ) - leftCows.begin();
  126.         ans += end - start;
  127.         if(isDiag) cout << "i: " << i << ", rightCows: " << rightCows[i]  <<", check with: " <<rightCows[i] +(2*t) << ", start: " << start<< ", end: " << end<< endl;
  128.     }
  129.    
  130.    
  131.    
  132.    
  133.     if(!isDiag) freopen("meetings.out", "w", stdout);
  134.     cout << ans << endl;
  135.    
  136.     return 0;
  137. }
  138.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement