[2010福建] 五元组问题 - 树状数组

本文介绍了如何利用树状数组解决信息学竞赛中的五元组计数问题。通过分析二元组、三元组直至五元组的逻辑关系,利用树状数组的高效更新和查询特性,逐步迭代统计满足条件的五元组数量。文章提供样例输入输出,并附带源代码实现。
摘要由CSDN通过智能技术生成

题目描述

给定n个数字,组成数字串 A1, A2, …, An。
五元组{ i, j, k, s, t }满足以下两个条件:
  a) 1 ≤ i < j < k < s < t ≤ n
  b) Ai < Aj < Ak < As < At
例如,数字串{2, 1, 3, 4, 5, 7, 6}中,包含以下4个五元组{1, 3, 4, 5, 6}, {2, 3, 4, 5, 6}, {1, 3, 4, 5, 7} 和 {2, 3, 4, 5, 7}。
求给定数字串所包含的五元组的个数。


输入格式

第一行一个整数n(1≤n≤50,000),表示数字串包含n个数字。第二行包括n个数字A1, A2, …, An(1≤Ai≤1,000,000)。


输出格式

输出一行一个整数,表示五元组的个数。


样例数据

样例输入

【样例1】
5
1 2 3 4 5
【样例2】
7
2 1 3 4 5 7 6
【样例3】
7
1 2 3 4 5 6 7

样例输出

【样例1】
1
【样例2】
4
【样例3】
21


题目分析

欲做此题,先做此题
统计二元组是很简单的问题,用树状数组可以轻松搞定。
分析三元组:
i < j < k
Ai < Aj < Ak
因为二元组已经求出,故可以转化为
(i < j) < k
(Ai < Aj) < Ak
插入该三元组,清空原二元组数目,迭代统计比他小的刚刚统计完的二元组数目。
以此类推
一直推到五元组
不想写高精度了,打了biginteger


源代码

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
inline const int Get_Int() {
    int num=0,bj=1;
    char x=getchar();
    while(x<'0'||x>'9') {
        if(x=='-')bj=-1;
        x=getchar();
    }
    while(x>='0'&&x&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值