zoukankan      html  css  js  c++  java
  • hihocoder-1550-顺序三元组

    hihocoder-1550-顺序三元组

    #1550 : 顺序三元组

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定一个长度为N的数组A=[A1, A2, ... AN],已知其中每个元素Ai的值都只可能是1, 2或者3。

    请求出有多少下标三元组(i, j, k)满足1 ≤ i < j < k ≤ N且Ai < Aj < Ak。  

    输入

    第一行包含一个整数N  

    第二行包含N个整数A1, A2, ... AN。(1 ≤ Ai ≤ 3)  

    对于30%的数据,1 ≤ N ≤ 100  

    对于80%的数据,1 ≤ N ≤ 1000  

    对于100%的数据,1 ≤ N ≤ 100000  

    输出

    一个整数表示答案

    样例输入
    6
    1 3 2 1 2 3
    样例输出
    3

    注意:

      需要使用long long 类型来保存 ans。 oj特别需要注意这个!!!!

    #include <cstdio> 
    const int MAXN = 100000 + 10; 
    
    int num[MAXN], dp[MAXN]; 
    
    int  main(){
    
        int n; 
        long long tmp, ans; 
        while(scanf("%d", &n) != EOF){
            for(int i=1; i<=n; ++i){
                scanf("%d", &num[i]); 
            }
            dp[0] = 0; 
            for(int i=1; i<=n; ++i){
                if(num[i] == 1){
                    dp[i] = dp[i-1] + 1; 
                }else{
                    dp[i] = dp[i-1]; 
                }
            }
            for(int i=1; i<=n; ++i){
                if(num[i] != 2){
                    dp[i] = 0; 
                }
            }
            tmp = 0; ans = 0; 
            for(int i=1; i<=n; ++i){
                tmp += dp[i]; 
                if(num[i] == 3){
                    ans += tmp; 
                }
            }
            printf("%lld
    ", ans );
        }
        return 0; 
    }
    

      

    参考了discuss中的网友的答案,更加简洁。

    #include <cstdio> 
    const int MAXN = 100000 + 10; 
    
    int num[MAXN]; 
    
    int main(){
    
        int n; 
        long long ans; 
        while(scanf("%d", &n) != EOF){ 
            for(int i=1; i<=n; ++i){
                scanf("%d", &num[i]); 
            } 
            ans = 0;
            int l = 0, r = 0; 
            for(int i=1; i<=n; ++i){
                if(num[i] == 3){
                    ++r; 
                }
            }
    
            for(int i=1; i<=n; ++i){
                if(num[i] == 1){
                    ++l; 
                }else if(num[i] == 2){
                    ans = ans + l * r; 
                }else{
                    --r; 
                }
            }
            printf("%lld
    ", ans );
        }
        return 0; 
    } 
    

      

  • 相关阅读:
    OI数学知识清单
    线段树入门教程
    扩展欧几里得定理基础讲解 代码及证明
    名字竞技场 V3.0
    可持久化线段树(主席树)新手向教程
    矩阵乘法浅析
    [Luogu] P1233 木棍加工
    高斯消元 模板
    位运算技巧
    [ZJOJ] 5794 2018.08.10【2018提高组】模拟A组&省选 旅行
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/7363652.html
Copyright © 2011-2022 走看看