原题链接
题面
思路
因为没有规定i,j,k,所以可以对三个数组进行排序
枚举b,然后在a数组中找到比b[j],小的最后一个数的编号i,再找到比b[j]大的第一个数的编号k,再用(i - 1) * (n - k + 1)算出有几种方案,然后求总和即可。
注意开longlong
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
signed main()
{
int n; cin >> n;
int sum = 0;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
for (int i = 1; i <= n; i ++ ) cin >> b[i];
for (int i = 1; i <= n; i ++ ) cin >> c[i];
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + n);
sort(c + 1, c + 1 + n);
a[0] = 0x3f3f3f3f;
b[0] = 0x3f3f3f3f;
c[0] = 0x3f3f3f3f;
a[n + 1] = -0x3f3f3f3f;
b[n + 1] = -0x3f3f3f3f;
c[n + 1] = -0x3f3f3f3f;
for (int j = 1; j <= n; j ++ )
{
int i = lower_bound(a + 1, a + 1 + n, b[j]) - a;
// cout << i << " " << j << endl;
if (b[j] > a[i - 1])
{
int k = upper_bound(c + 1, c + 1 + n, b[j]) - c;
if (c[k] > b[j])
{
// cout << i << " " << j << " " << k << endl;
sum = sum + (i - 1) * (n - k + 1);
}
}
}
cout << sum << endl;
return 0;
}
总结
一开始想的是枚举a[i],可是后来发现过不了,出现了一些问题,比如要用j*k时,可能就会有j后面的数其实比k大的情况,比较难处理,所以枚举b。