蓝桥 - 递增三元组

题意不说了
思路:以B数组为基准 寻找在A中第一个大于等于B元素的坐标 和 C中第一个大于B元素的坐标 相乘后加上即可。
这里用了二分 也可以用线性查找

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define sdd(a,b) scanf("%d%d",&a,&b)
#define cl(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define sddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define dbg() printf("aaa\n")
using namespace std;
const int maxn=1e5+10;
int n;
int a[maxn],b[maxn],c[maxn];
int main() {
	sd(n);
    rep(i,1,n) sd(a[i]);
    rep(i,1,n) sd(b[i]);
    rep(i,1,n) sd(c[i]);
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    sort(c+1,c+n+1);
    a[0]=c[0]=0;
    a[n+1]=c[n+1]=inf;
    ll ans=0;
    rep(i,1,n){
        int pa,pc;
        if(b[i]>a[n]) pa=n+1;
        else pa=lower_bound(a+1,a+n+1+1,b[i])-a;
        pc=upper_bound(c+1,c+n+1,b[i])-c;
        //printf("%d %d\n",pa,pc);
        ans+=((pa-1)*(n-(pc-1)));
    }
    printf("%lld\n",ans);
	return 0;
}
/*
3
1 2 4
2 3 4
3 4 5

3 4 2  9
*/
发布了120 篇原创文章 · 获赞 12 · 访问量 5259

猜你喜欢

转载自blog.csdn.net/weixin_43735161/article/details/105173916