Atcoder - Snuke Festival

原题:Snuke Festival

原题大意

给出长度为n的三个数组A,B,C,从A中取出a, 从B中取出b, 从C中取出c,使得a < b < c,问有多少种取法?

算法分析

把A,C 排序,对于B中的每一个元素,在A中找小于它的和在C中大于它的个数相乘,然后记录总和

程序代码

//lower_bound是大于等于,upper_bound是大于
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+50;
int a[maxn], b[maxn], c[maxn];
int n;
int main(){ 
    while(cin >> n){
        for(int i = 0; i < n; i++)cin >> a[i];
        for(int i = 0; i < n; i++)cin >> b[i];
        for(int i = 0; i < n; i++)cin >> c[i];
        sort(a, a+n);
        sort(c, c+n);
        ll ans = 0;
        for(int i = 0; i < n; i++){
            ll l = lower_bound(a, a+n, b[i]) - a;
            ll r = n - (upper_bound(c, c+n, b[i]) - c);
            ans += l*r;
        }
        cout << ans << endl;
    }
    return 0;
}