• poj 3378 Crazy Thairs dp+线段树+大数


    题目链接

    题目大意: 给出n个数, 让你求出有多少个5元组满足
    i < j < k < l < m并且ai < aj < ak < al < am

    我们令d[i][j]表示以j位置为末尾的长度是i的序列的个数。

    比如1234567这7个数。 dp[1][1], dp[1][2], dp[1][7]都是1。
    dp[2][1] = 0, dp[2][2] = 1(1, 2), dp[2][3] = 3( (1,3), (2,3))。 依次类推。
    那么显然以j位置结尾, 长度为i的个数等于 $ sum dp[i-1][k] $
    k为在j之前的, 并且ak < aj的数。
    具体可以自己画一画就很好明白。
    那么显然可以用树状数组来做。
    答案会爆long long 需要自己写大数。

    #include <iostream>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <complex>
    #include <cmath>
    #include <map>
    #include <set>
    #include <string>
    #include <queue>
    #include <stack>
    #include <bitset>
    using namespace std;
    #define pb(x) push_back(x)
    #define ll long long
    #define mk(x, y) make_pair(x, y)
    #define lson l, m, rt<<1
    #define mem(a) memset(a, 0, sizeof(a))
    #define rson m+1, r, rt<<1|1
    #define mem1(a) memset(a, -1, sizeof(a))
    #define mem2(a) memset(a, 0x3f, sizeof(a))
    #define rep(i, n, a) for(int i = a; i<n; i++)
    #define fi first
    #define se second
    typedef complex <double> cmx;
    typedef pair<int, int> pll;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int mod = 1e9+7;
    const int inf = 1061109567;
    const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    const int maxlen = 5;
    const int maxn = 5e4+5;
    struct BigInteger
    {
        int num[6];
        BigInteger() {
            mem(num);
        }
        BigInteger (int b) {
            mem(num);
            int len = 0;
            while(b) {
                num[len++] = b%10000000;
                b /= 10000000;
            }
        }
        BigInteger operator + (BigInteger a) const
        {
            BigInteger ret(0);
            for(int i = 0; i < maxlen; i++) {
                ret.num[i] = num[i] + a.num[i] + ret.num[i];
                ret.num[i+1] = ret.num[i]/10000000;
                ret.num[i] %= 10000000;
            }
            return ret;
        }
        void output() {
            int i;
            for(i = maxlen; i>= 0; i--) {
                if(num[i])
                    break;
            }
            printf("%d", num[i--]);
            for(; i>=0; i--) {
                printf("%07d", num[i]);
            }
            cout<<endl;
        }
    };
    BigInteger sum[5][maxn<<2];
    int a[maxn], b[maxn];
    void update(int id, int p, BigInteger val, int l, int r, int rt) {
        if(l == r) {
            sum[id][rt] = sum[id][rt] + val;
            return ;
        }
        int m = l+r>>1;
        if(p<=m)
            update(id, p, val, lson);
        else
            update(id, p, val, rson);
        sum[id][rt] = sum[id][rt<<1]+sum[id][rt<<1|1];
    }
    BigInteger query(int id, int L, int R, int l, int r, int rt) {
        if(L>R)
            return BigInteger(0);
        if(L<=l&&R>=r) {
            return sum[id][rt];
        }
        int m = l+r>>1;
        BigInteger ret(0);
        if(L<=m)
            ret = query(id, L, R, lson);
        if(R>m)
            ret = ret + query(id, L, R, rson);
        return ret;
    }
    int main()
    {
        int n;
        while(~scanf("%d", &n)) {
            for(int i = 1; i <= n; i++) {
                scanf("%d", &a[i]);
                b[i-1] = a[i];
            }
            mem(sum);
            sort(b, b+n);
            int cnt = unique(b, b+n)-b;
            for(int i = 1; i <= n; i++) {
                a[i] = lower_bound(b, b+cnt, a[i])-b+1;
            }
            BigInteger ans(0), one(1);
            for(int i = 1; i <= n; i++) {
                update(0, a[i], one, 1, n, 1);
                for(int j = 1; j < 5; j++) {
                    BigInteger tmp = query(j-1, 1, a[i]-1, 1, n, 1);
                    update(j, a[i], tmp, 1, n, 1);
                    if(j == 4) {
                        ans = ans+tmp;
                    }
                }
            }
            ans.output();
        }
        return 0;
    }
    
    
  • 相关阅读:
    【Kubernetes学习之一】Kubernetes 简介
    eclipse&myeclipse 生成jar包后,spring无法扫描到bean定义
    【Docker学习之七】Docker图形化管理和监控
    【Docker学习之六】Docker容器互联
    【Docker学习之五】Docker自定义镜像示例
    【Docker学习之四】Docker自定义容器镜像
    【Docker学习之三】Docker查找拉取镜像、启动容器、容器使用
    【Docker学习之二】Docker部署安装
    Tensorflow之tf.metrics
    pytorch 实现多分类
  • 原文地址:https://www.cnblogs.com/yohaha/p/5337264.html
Copyright © 2020-2023  润新知