AcWing 1236. 递增三元组

题目链接

二分法

  • 固定一个数组
  • 对另外两个数组二分
  • 注意处理边界
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e5+5;
int a[N], b[N], c[N];

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);
    long long res = 0;
    for(int i = 0; i < n; i++){
    
    
        int l = 0, r = n-1;
        while(l < r){
    
    
            int mid = l + r + 1 >> 1;
            if(a[mid] < b[i]) l = mid;
            else r = mid - 1;
        }
        if(a[l] >= b[i]) l = -1;
        long long left = l + 1;
        l = 0, r = n-1;
        while(l < r){
    
    
            int mid = l + r >> 1;
            if(c[mid] > b[i]) r = mid;
            else l = mid + 1;
        }
        if(c[l] <= b[i]) l = n;
        long long right = n - l;
        res += left*right;
    }
    printf("%lld", res);
    return 0;
}

おすすめ

転載: blog.csdn.net/SYaoJun/article/details/117810481