zoukankan      html  css  js  c++  java
  • 【HOJ2275】Number Sequence-组合

    题目大意:给一个长为N的数列A,求满足Ai<Aj>Ak且i<j<k的三元组的个数。

    做法:先从前面开始找前面比A[i]小的元素个数ans1[i],再从后面开始找后面比A[i]小的元素个数ans2[i],根据组合原理可以得出最后的答案为:ans1[1]*ans2[1]+...+ans1[N]*ans2[N]。可以用线段树或树状数组来维护。

    以下是本人代码(树状数组):

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,a[50010]={0};
    long long c[50010]={0},ans1[50010]={0},ans2[50010]={0},ans;
    
    int lowbit(int i)
    {
      return i&(-i);
    }
    
    void add(int x)
    {
      for(int i=x;i<=50000;i+=lowbit(i))
        c[i]++;
    }
    
    int sum(int x)
    {
      int s=0;
      for(int i=x;i>0;i-=lowbit(i))
        s+=c[i];
      return s;
    }
    
    void input()
    {
      for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    }
    
    void work()
    {
      memset(c,0,sizeof(c));
      for(int i=1;i<=n;i++)
      {
        add(a[i]+2);
    	ans1[i]=sum(a[i]+1);
      }
      memset(c,0,sizeof(c));
      for(int i=n;i>=1;i--)
      {
        add(a[i]+2);
        ans2[i]=sum(a[i]+1);
      }
      ans=0;
      for(int i=1;i<=n;i++)
        ans+=ans1[i]*ans2[i];
    }
    
    void output()
    {
      printf("%lld
    ",ans);
    }
    
    int main()
    {
      while(scanf("%d",&n)!=EOF)
      {
        input();
        work();
        output();
      }
      
      return 0;
    }
    


  • 相关阅读:
    33 函数参数的传递方式
    33 函数递归调用
    32 头文件
    31 函数
    30 枚举
    centos6.5升级默认的Mysql到5.5方法
    Centos6.5命令行快捷键
    redhat 安装lamp
    CentOS6.5中的vsftpd安装配置
    添加一个用户并且让用户获得root权限
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793990.html
Copyright © 2011-2022 走看看