zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/tomori/p/13684102.html
Copyright © 2011-2022 走看看