1236. 递增三元组 二分
Published on 2022-11-17 23:02 in 暂未分类 with 林动

1236. 递增三元组 二分

    给定三个整数数组

    A=[A1,A2,…AN],
    B=[B1,B2,…BN],
    C=[C1,C2,…CN],

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

    1≤i,j,k≤N
    Ai<Bj<Ck
    输入格式
    第一行包含一个整数 N。

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

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

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

    输出格式
    一个整数表示答案。

    数据范围
    1≤N≤105,
    0≤Ai,Bi,Ci≤105
    输入样例:
    3
    1 1 1
    2 2 2
    3 3 3
    输出样例:
    27

    枚举b,找比bi小的ai个数和比bi大的ci个数

    import java.util.*;
    
    public class Main
    {
    	static int N=100005;
    	static int a[]=new int [N],b[]=new int[N],c[]=new int[N],n;
    	static long ans;
    	static int bf1(int x){//最右
    		int l=-1,r=n-1;
    		while(l<r){
    			int mid=l+r+1>>1;
    			if(a[mid]<x)l=mid;
    			else r=mid-1;
    		}
    		return r;
    	}
    	static int bf2(int x){
    		int l=0,r=n;
    		while(l<r){
    			int mid=l+r>>1;
    			if(c[mid]>x)r=mid;
    			else l=mid+1;
    		}
    		return r;
    	}
    	public static void main(String args[]){
    		Scanner sc=new Scanner(System.in);
    		n=sc.nextInt();
    		for(int i=0;i<n;++i)a[i]=sc.nextInt();
    		for(int i=0;i<n;++i)b[i]=sc.nextInt();
    		for(int i=0;i<n;++i)c[i]=sc.nextInt();
    		Arrays.sort(a,0,n);
    		Arrays.sort(b,0,n);
    		Arrays.sort(c,0,n);
    		//System.out.println(bf1(1));
    		for(int i=0;i<n;++i){
    			long n1=bf1(b[i])+1;
    			long n2=n-bf2(b[i]);
    			ans+=n1*n2;
    			
    		}
    		System.out.println(ans);
    	}
    }
    
    posted @   林动  阅读(11)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
    · 单线程的Redis速度为什么快?
    · SQL Server 2025 AI相关能力初探
    · AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
    · 展开说说关于C#中ORM框架的用法!
    点击右上角即可分享
    微信分享提示