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;
    }
    
  • 相关阅读:
    Reflector 插件
    Tips for ILMerge
    WaitAll for multiple handles on a STA thread is not supported 解决方案
    MSI: UAC return 0x800704C7
    SET与SETX的区别
    年在Copyright中的含义
    gacutil : 添加.NET 4.0 assembly 到GAC失败
    LicenseContext.GetSavedLicenseKey 需要 FileIOPermission
    Linq学习之linq基础知识
    SQL Server 2008如何导出带数据的脚本文件
  • 原文地址:https://www.cnblogs.com/tomori/p/13684102.html
Copyright © 2011-2022 走看看