题目描述
给定三个整数数组
A = [A_1, A_2, \cdots A_N]A=[A1,A2,⋯AN],
B = [B_1, B_2, \cdots B_N]B=[B1,B2,⋯BN],
C = [C_1, C_2, \cdots C_N]C=[C1,C2,⋯CN],
请你统计有多少个三元组 (i, j, k)(i,j,k) 满足:
-
1 \leq i, j, k \leq N1≤i,j,k≤N;
-
A_i < B_j < C_kAi<Bj<Ck。
输入描述
第一行包含一个整数 NN。
第二行包含 NN 个整数 A_1, A_2, \cdots A_NA1,A2,⋯AN。
第三行包含 NN 个整数 B_1, B_2, \cdots B_NB1,B2,⋯BN。
第四行包含 NN 个整数 C_1, C_2, \cdots C_NC1,C2,⋯CN。
其中,1 \leq N \leq 10^5, 0 \leq Ai, Bi, Ci \leq 10^51≤N≤105,0≤Ai,Bi,Ci≤105。
输出描述
输出一个整数表示答案。
输入输出样例
示例
输入
3
1 1 1
2 2 2
3 3 3
输出
27
运行限制
- 最大运行时间:2s
- 最大运行内存: 256M
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int *a=new int[n];//申请空间给一个大小为n的数组,指针a指向它
int *b=new int[n];
int *c=new int[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(b,b+n);
sort(c,c+n);
long long sum=0;
long long p=0,q=0;//细节1
for(int i=0;i<n;i++)
{
while(p<n&&a[p]<b[i])
p++;
while(q<n&&c[q]<=b[i])//细节2
q++;
sum+=p*(n-q);
}
cout<<sum;
return 0;
}
细节1:
此处定义变量在for循环里的话一定会超时,在外面就不用每次从1开始累加,不会超时。
定义它也需要长整型,不然没法过
细节2:
这里计算的是<=,这就和细节1相呼应了,中间不能中断,要是写>=的话每次都不一样,不再是和前一个有关的数据了,所以这里采用总数减去小于的得到大于b的