• 【树状数组】五元组问题


    Description

      给定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}。
      求给定数字串所包含的五元组的个数。

    Input

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

    Output

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

    Sample Input

    【样例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

    Sample Output

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


    思路

    • 开long long+高精度
    • 求二元组的数量,再用这个数量求三元组数量,以此类推

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define maxn 50005
    #define int long long
    using namespace std;
    int n,a[maxn],c[1000005],ans[50];
    long long f[maxn];
    int lowbit(int x){return x&(-x);}
    void add(int x,int d){for(int i=x;i<=1000000;i+=lowbit(i)) c[i]+=d;}
    long long ask(int x)
    {
    	long long ans=0;
    	for(int i=x;i;i-=lowbit(i)) ans+=c[i];
    	return ans;
    }
    void jia(int a[],int b[])
    {
    	if(a[0]<b[0]) a[0]=b[0];
    	for(int i=1;i<=a[0];++i) a[i]+=b[i];
    	for(int i=1;i<=a[0];++i) a[i+1]+=a[i]/10,a[i]%=10;
    	if(a[a[0]+1]>0) ++a[0];
    }
    void print(int a[])
    {
    	if(a[0]==0) printf("0
    ");
    	for(int i=a[0];i;--i) cout<<a[i];
    }
    signed main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i) scanf("%d",&a[i]),f[i]=1;
    	for(int i=2;i<=5;++i)//求i元组
    	{
    		memset(c,0,sizeof(c));
    		add(a[i-1],f[i-1]); f[i-1]=0;
    		for(int j=i;j<=n;++j) add(a[j],f[j]),f[j]=ask(a[j]-1);
    	}
    	for(int i=5;i<=n;++i)//高精度f[i]之和
    	{
    		int temp[50]; memset(temp,0,sizeof(temp));
    		while(f[i]>0) temp[++temp[0]]=f[i]%10,f[i]/=10;
    		jia(ans,temp);
    	}
    	print(ans);
    	return 0;
    }
    
  • 相关阅读:
    oracle正装表达式匹配中文
    oracle利用循环批量检索对应的数据
    oracle不完全恢复
    informatica简易教程
    oracle创建用户的小问题
    宿主机sqlplus连接虚拟机oracle
    ETL采集原表语句生成
    Mac版 MicrosoftOffice2015 办公软件 破解教程
    BetterZip,支持rar等多种压缩解压方式(Xcode自身不能解压rar)
    Xcode --自动注释插件VVDocumenter-Xcode(配置须知)
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13427109.html
Copyright © 2020-2023  润新知