递增三元组
[蓝桥杯 2018 省 B] 递增三元组
题目描述
给定三个整数数组 A=[A1,A2,⋯,AN]A = [A_1, A_2,\cdots, A_N]A=[A1,A2,⋯,AN],B=[B1,B2,⋯,BN]B = [B_1, B_2,\cdots, B_N]B=[B1,B2,⋯,BN],C=[C1,C2,⋯,CN]C = [C_1, C_2,\cdots,C_N]C=[C1,C2,⋯,CN]。
请你统计有多少个三元组 (i,j,k)(i, j, k)(i,j,k) 满足:
- 1≤i,j,k≤N1 \le i, j, k \le N1≤i,j,k≤N
- Ai<Bj<CkA_i < B_j < C_kAi<Bj<Ck
输入格式
第一行包含一个整数 NNN。
第二行包含 NNN 个整数 A1,A2,⋯,ANA_1, A_2,\cdots, A_NA1,A2,⋯,AN。
第三行包含 NNN 个整数 B1,B2,⋯,BNB_1, B_2,\cdots, B_NB1,B2,⋯,BN。
第四行包含 NNN 个整数 C1,C2,⋯,CNC_1, C_2,\cdots, C_NC1,C2,⋯,CN。
输出格式
一个整数表示答案
样例 #1
样例输入 #1
3
1 1 1
2 2 2
3 3 3
样例输出 #1
27
提示
对于 30%30\%30% 的数据,1≤N≤1001 \le N \le 1001≤N≤100。
对于 60%60\%60% 的数据,1≤N≤10001 \le N \le 10001≤N≤1000。
对于 100%100\%100% 的数据,1≤N≤1051 \le N \le 10^51≤N≤105,0≤Ai,Bi,Ci≤1050 \le A_i, B_i, C_i \le 10^50≤Ai,Bi,Ci≤105。
暴力
#include <bits/stdc++.h>
using namespace std;int main()
{int num,a[100005],b[100005],c[100005],ans;cin>>num;for(int i=1;i<=num;i++)cin>>a[i];for(int i=1;i<=num;i++)cin>>b[i];for(int i=1;i<=num;i++)cin>>c[i];for(int i=1;i<=num;i++){for(int j=1;j<=num;j++){for(int k=1;k<=num;k++){if(a[i]<b[j]&&b[j]<c[k])ans++;}}}cout<<ans;
}
改进暴力
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[100005];
int b[100005];
int c[100005];int main()
{int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}for(int i=0;i<n;i++){scanf("%d",&b[i]);}for(int i=0;i<n;i++){scanf("%d",&c[i]);}sort(a,a+n);sort(b,b+n);sort(c,c+n);ll aa=0;//a数组标记ll cc=0;//c数组标记ll ans=0;for(int i=0;i<n;i++){// cout<<"----ai="<<aa<<" cc="<<cc<<endl;while(a[aa]<b[i]&&aa<n)//注意条件,不能等于aa++;while(c[cc]<=b[i]&&cc<n)//同上cc++;// cout<<"ai="<<aa<<" cc="<<cc<<endl;ans+=aa*(n-cc);}cout<<ans<<endl;
}