P8667 [蓝桥杯 2018 省 B] 递增三元组(摘自洛谷)

给定三个整数数组 A=[A1​,A2​,⋯,AN​],B=[B1​,B2​,⋯,BN​],C=[C1​,C2​,⋯,CN​]。

请你统计有多少个三元组 (i,j,k) 满足:

  1. 1≤i,j,k≤N
  2. Ai​<Bj​<Ck​

输入格式

第一行包含一个整数 N。

第二行包含 N 个整数 A1​,A2​,⋯,AN​。

第三行包含 N 个整数 B1​,B2​,⋯,BN​。

第四行包含 N 个整数 C1​,C2​,⋯,CN​。

输出格式

一个整数表示答案

输入输出样例

输入

3
1 1 1
2 2 2
3 3 3

输出 

27

说明/提示

对于 30% 的数据,1≤N≤100。

对于 60% 的数据,1≤N≤1000。

对于 100% 的数据,1≤N≤105,0≤Ai​,Bi​,Ci​≤105。

//代码使用二分搜索解决

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//三元组中元素个数
int N;
//创建三元组
vector<int>  create(int n){
    vector<int> source(n);
    for(int i=0;i<n;i++){
        cin>>source[i];
    }
        //排序好 
        sort(source.begin(),source.end());
    return source;}

//二分算法
//查找数组中大于target的元素个数 
int bigselect(vector<int> arr,int target){
    int res=-1;
    int left=0,right=arr.size()-1;
    while(left<=right){
        //计算 
        int mid=left + (right - left) / 2;
        if(arr[mid]>target){
            res=mid;
            right=mid-1;
        }else{
            left=mid+1;
        }       
    }
    if(res==-1)return 0;
    return arr.size()-res;    
}
//查找数组中小于target的元素个数 
int smallselect(vector<int> arr,int target){
    int res=-1;
    int left=0,right=arr.size()-1;
    while(left<=right){
        //计算中位数 
        int mid=left + (right - left) / 2;
        if(arr[mid]<target){
            res=mid;
            left=mid+1;
            
        }else{
        right=mid-1;}}
    if(res==-1)return 0;
    return res+1;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>N;
//创建三元组 
    vector<int> numi=create(N);
    vector<int> numj=create(N);
    vector<int> numk=create(N);
    int res=0;
    for(int j=0;j<numj.size();j++){
        int a=smallselect(numi,numj[j]);
        int b=bigselect(numk,numj[j]);
        res+=a*b;
    }    
    cout<<res<<endl;
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值