Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- bool isDiag = false;
- int N, L;
- struct Cow{
- int w, x, d;
- Cow(){};
- Cow(int w, int x, int d):w(w), x(x), d(d){}
- };
- int get_time(vector<Cow> cows){
- vector<int> leftCows, rightCows;
- int total_w = 0;
- for (Cow cow: cows)
- {
- if (cow.d == -1)
- {
- leftCows.push_back(cow.x);
- }else
- {
- rightCows.push_back(L - cow.x);
- }
- total_w += cow.w;
- }
- vector<pair<int, int>> f;
- for (int i = 0; i < leftCows.size(); i++)
- {
- f.push_back({leftCows[i], cows[i].w});
- }
- for (int i = 0; i < rightCows.size(); i++)
- {
- f.push_back({rightCows[i], cows[leftCows.size()+i].w});
- }
- sort(f.begin(), f.end());
- int sum = 0;
- for (int i = 0; i < f.size(); i++)
- {
- sum += f[i].second;
- if(isDiag)cout << "pos: " << f[i].first << ", weight: " << f[i].second <<", sum: " << sum << ", total_weight: " << total_w<< endl;
- //if ((sum * 2) > total_w) !!!problem cause invalid result for case 2 & 3
- if ((sum * 2) >= total_w)
- {
- return f[i].first;
- }
- }
- return 0;
- }
- int main(){
- //isDiag = true;
- if (isDiag)
- {
- freopen("meetings_silver_dec19/2.in", "r", stdin);
- //freopen("meeting.in", "r", stdin);
- }else{
- freopen("meetings.in", "r", stdin);
- }
- cin >> N >> L;
- vector<Cow> cows(N);
- for (int i = 0; i < N; i++)
- {
- cin >> cows[i].w >> cows[i].x >> cows[i].d;
- }
- sort(cows.begin(), cows.end(), [](Cow a, Cow b){
- return a.x < b.x;
- });
- int t = get_time(cows);
- vector<int> leftCows, rightCows;
- for (Cow cow: cows)
- {
- if (cow.d == -1)
- {
- leftCows.push_back(cow.x);
- }else
- {
- rightCows.push_back(cow.x);
- }
- }
- if(isDiag) cout << "t: " << t << endl;
- //if (isDiag)
- //{
- //cout << "right cows: >> " ;
- //for (int i = 0; i < rightCows.size(); i++)
- //{
- //cout << rightCows[i] << ", ";
- //}
- //cout << endl;
- //}
- int ans = 0;
- //for (int i = 0; i < leftCows.size(); i++)
- //{
- //int start = lower_bound(rightCows.begin(), rightCows.end(), leftCows[i] - (2*t) ) - rightCows.begin();
- //int end = lower_bound(rightCows.begin(), rightCows.end(), leftCows[i] ) - rightCows.begin();
- //ans += end - start;
- //if(isDiag) cout << "i: " << i << ", leftCows: " << leftCows[i] <<", check begin: " << leftCows[i] - (2*t)<< ", start: " << start << ", end: " << end << endl;
- //}
- if (isDiag)
- {
- cout << "left cows: >> " ;
- for (int i = 0; i < leftCows.size(); i++)
- {
- cout << leftCows[i] << ", ";
- }
- cout << endl;
- }
- for (int i = 0; i < rightCows.size(); i++)
- {
- int start = upper_bound(leftCows.begin(), leftCows.end(), rightCows[i] ) - leftCows.begin();
- int end = upper_bound(leftCows.begin(), leftCows.end(), rightCows[i] +(2*t) ) - leftCows.begin();
- ans += end - start;
- if(isDiag) cout << "i: " << i << ", rightCows: " << rightCows[i] <<", check with: " <<rightCows[i] +(2*t) << ", start: " << start<< ", end: " << end<< endl;
- }
- if(!isDiag) freopen("meetings.out", "w", stdout);
- cout << ans << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement