Editorial for Math Contest


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence.

tr

Öncelikle bize verilen 3 diziyi küçükten büyüğe sıralamamız gerek. Daha sonra ortada bulunması gereken Lise dizisini for döngüsü ile geziyoruz.

Her Lise[i] elemanı için bundan küçük olan Ortaokul dizisindeki eleman sayısını ve büyük olan Üniversite dizisindeki eleman sayısını bulmamız gerek.

Bunun için Binary Search algoritmasını kullanabiliriz. Bizden küçük ortaokul sayısı ile büyük üniversite sayısını çarptığımızda aslında o lise elemanı için bütün olasılıkları hesaplamış oluyoruz. Bu nedenle her lise elemanı için bunu yapıp cevaba eklediğimizde sonuca ulaşmış oluyoruz.

en

First, we need to sort the given sequences, then we will iterate over the second sequence (HighSchool).

For each HighSchool[i] we need to find the number of elements in the sequence MiddleSchool that are less than HighSchool[i] and the the number of elements in the sequence University that are greater than HighSchool[i].

To find those, we can use Binary Search Algorithm. The product of these two numbers gives us the number of possible teams with Highschool[i] in it. We need to do the previous steps for all HighSchool[i], and the summation will yield the number of all possible teams.

#include <bits/stdc++.h>
using namespace std;
long long A, B, C, a[300005], b[300005], c[300005], ans;

using namespace std;
int main(){
    cin >> A >> B >> C;
    for(int i=1;i<=A;i++) cin >> a[i];
    for(int i=1;i<=B;i++) cin >> b[i];
    for(int i=1;i<=C;i++) cin >> c[i];

    sort(a+1,a+A+1);
    sort(b+1,b+B+1);
    sort(c+1,c+C+1);

    long long ans=0;
    for(int i=1;i<=B;i++){
        long long left = lower_bound(a+1,a+A+1,b[i]) - (a+1);
        long long right = C - (lower_bound(c+1,c+C+1,b[i]+1) - (c+1));

        ans += left*right;
    }
    cout << ans << endl;
}