1236. 递增三元组

数据范围10^5, 所以考虑O(nlogn)或者O(n)的复杂度,所以最多枚举一个数组。

到底是枚举数组a,还是b还是c

要求满足ai < bi < ci

如果枚举a,那么由于b和c之间存在限制,即对b和c的选择不独立,所以不可以用乘法原理

而枚举b的话,a和c是独立的, 可以用乘法原理。

前缀和O(n)

#include<iostream>
#include<cstring>

#define LL long long

using namespace std;

const int N = 100010;
int a[N], b[N], c[N];
int as[N], cs[N];
int n, cnt[N];

int main(){
    scanf("%d", &n);
    
    for(int i = 0; i < n; i ++) scanf("%d", &a[i]), a[i] ++;
    for(int i = 0; i < n; i ++) scanf("%d", &b[i]), b[i] ++;
    for(int i = 0; i < n; i ++) scanf("%d", &c[i]), c[i] ++;
    
    for(int i = 0; i < n; i ++) cnt[a[i]] ++;
    for(int i = 1; i <= N; i ++) as[i] = as[i - 1] + cnt[i];
    
    memset(cnt, 0, sizeof cnt);
    
    LL res = 0;
    
    for(int i = 0; i < n; i ++) cnt[c[i]] ++;
    for(int i = 1; i <= N; i ++) cs[i] = cs[i - 1] + cnt[i];
    
    for(int i = 0; i < n; i ++) res += (LL) as[b[i] - 1] * (n - cs[b[i]]);
    
    cout << res;
    
    return 0;
}

排序+二分O(nlogn)

#include<iostream>
#include<cstring>
#include<algorithm>

#define LL long long

using namespace std;

const int N = 100010;
int a[N], b[N], c[N];
int as[N], cs[N];
int n, cnt[N];

int findl(int x){
    int l = 0, r = n - 1;
    while(l < r){
        int mid = l + r + 1 >> 1;
        if(a[mid] < x) l = mid;
        else r = mid - 1;
    }
    if(a[l] < x) return l;
    return -1;
}

int findr(int x){
    int l = 0, r = n - 1;
    while(l < r){
        int mid = l + r >> 1;
        if(c[mid] > x) r = mid;
        else l = mid + 1;
    }
    if(c[l] > x) return l;
    return n;
}

int main(){
    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 res = 0;
    
    for(int i = 0; i < n; i ++){
        int l = findl(b[i]), r = findr(b[i]);
        res += (LL) (l + 1) * (n - r);
        
    }
    cout << res;
    
    return 0;
}
posted @ 2020-09-17 11:23  yys_c  阅读(258)  评论(0编辑  收藏  举报