顺序三元组

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

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

Input

第一行包含一个整数N  

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

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

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

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

Output

一个整数表示答案

Sample Input
6
1 3 2 1 2 3
Sample Output
3

首先看一下题思路,如何找到三元组?先找到一个2,假设它的前边有n个1,后边有m个3,这该2能组成的三元组有n*m个;把所有2能组成的三元组加起来就是答案;


#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

long long A[100005];
int main(){

    int N;
    cin >> N;
    long long cnt_3, cnt_1;
    cnt_3=cnt_1=0;
    for(int i=0; i<N; i++){
        cin >> A[i];
        if(A[i]==3) cnt_3++;               //计算3的个数;
    }
    long long ans=0;
    for(int i=0; i<N; i++){
        if(A[i]==1) cnt_1++;               //1的个数;
        if(A[i]==3) cnt_3--;               //每遇到一个三,就减少3的个数,因为之后的1,2,无法与他
                                           //构成递增序列;
        if(A[i]==2) ans+=cnt_1*cnt_3;
    }
    cout << ans << endl;
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三元组顺序表加法是指在两个三元组顺序表之间进行元素相加的操作。假设有两个三元组顺序表A和B,它们的存储结构为三个一维数组data、row、col。其data数组存储三元组的元素值,row数组存储相应元素在矩阵的行号,col数组存储相应元素在矩阵的列号。 实现三元组顺序表的加法,首先要判断两个三元组顺序表的行数和列数是否相等,只有相等时才能进行加法操作。然后按照以下步骤进行: 1. 创建一个新的三元组顺序表C,用于存储两个三元组顺序表相加的结果。 2. 分别设置两个指针pA和pB,分别指向A和B的data数组的起始位置。 3. 利用循环遍历data数组,将A和B的对应位置的元素相加,并将相加的结果存储到C的data数组。 4. 在遍历过程,如果pA所指示的元素的行号小于pB所指示的元素的行号,将pA向后移动一位;如果行号相等,则比较列号,如果pA所指示的元素的列号小于pB所指示的元素的列号,则将pA向后移动一位;如果列号相等,则将两个元素的值相加,并将相加的结果存储到C的data数组。 5. 在每次循环,将C的row数组和col数组的对应位置分别更新为pA所指示元素的行号和列号。 6. 循环结束后,C的data数组存储的就是A和B相加的结果,C的row数组和col数组就是相应元素在矩阵的行号和列号。 最后,返回C作为两个三元组顺序表相加的结果。这样就实现了三元组顺序表的加法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值