Crazy Thairs【树状数组+高精度+DP思想】

2023-11-16

题目链接 POJ-3378


  题意:有N个点,问的是要求组成一个长度为5的上升子序列的组成有多少种?最搞事情的是这道题不用取模!(所以,是一定会爆long long的)。

  首先,很容易想到一点就是我们可以开一个dp[maxN][5],表示的是“dp[i][j]当第i个作为这5层中的第j层的时候的组成可能性”。所以,很容易推导的一个dp方程就是\large dp[i][j] = \sum_{k=1}^{i-1} dp[k][j-1],(a[i] > a[k])

  有了这个方程之后,问题就好办了,很容易发现这就是一个开5个树状数组(你要是实在要省,可以开4个)来维护一个前缀和的事情了,我们要统计的答案就是前面所有的小于a[i]的值的作为层j-1时候的答案合计。

  好了,问题就这样迎刃而解了?

  没有这么简单,这道题的精髓就在于会爆long long,并且还卡了内存,所以用点黑科技吧,之前,高精度的每一位都表示的是0~9中的数,现在不一样了,每一位表示0~99999999(8个9)也就是1e9个数。这样我们就可以将原来的内存需求降到原先的九分之一了。

  但是这个的输出可没有那么的简单了,因为可能这一位有前导零啊,所以,我们还是要自定义输出一下,注意一下这个细节。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 5e4 + 7;
const ll Base = 1e9;
int N, a[maxN], Lsan[maxN], _UP;
struct Big_Num
{
    int len;
    ll num[7];
    Big_Num() { memset(num, 0, sizeof(num)); len = 0; }
    friend Big_Num operator + (Big_Num e1, Big_Num e2)
    {
        Big_Num ans;
        ans.len = max(e1.len, e2.len);
        for(int i=0; i<ans.len; i++)
        {
            ans.num[i] = ans.num[i] + e1.num[i] + e2.num[i];
            if(ans.num[i] >= Base)
            {
                ans.num[i] -= Base;
                ans.num[i + 1]++;
                if(i + 1 == ans.len) ans.len++;
            }
        }
        return ans;
    }
    inline void print()
    {
        if(!len) printf("0");
        else
        {
            printf("%lld", num[len - 1]);
            for(int i=len - 2; i>=0; i--) for(int j=Base / 10; j; j/=10) { printf("%lld", num[i]/j); num[i] %= j; }
        }
        printf("\n");
    }
} ans;
struct BIT_TREE
{
    Big_Num tree[maxN];
    inline void update(int x, Big_Num val)
    {
        while(x <= _UP)
        {
            tree[x] = tree[x] + val;
            x += lowbit(x);
        }
    }
    inline Big_Num query(int x)
    {
        Big_Num sum;
        while(x)
        {
            sum = sum + tree[x];
            x -= lowbit(x);
        }
        return sum;
    }
} t[5];
int main()
{
    Big_Num One, tmp; One.len = 1; One.num[0] = 1;
    while(scanf("%d", &N) != EOF)
    {
        ans = Big_Num();
        for(int i=1; i<=N; i++) { scanf("%d", &a[i]); Lsan[i] = a[i]; }
        sort(Lsan + 1, Lsan + N + 1);
        _UP = (int)(unique(Lsan + 1, Lsan + N + 1) - Lsan - 1);
        for(int i=0; i<5; i++) for(int j=1; j<=_UP; j++) t[i].tree[j] = Big_Num();
        for(int i=1; i<=N; i++) a[i] = (int)(lower_bound(Lsan + 1, Lsan + _UP + 1, a[i]) - Lsan);
        for(int i=1; i<=N; i++)
        {
            t[0].update(a[i], One);
            for(int j=1; j<5; j++)
            {
                tmp = t[j - 1].query(a[i] - 1);
                t[j].update(a[i], tmp);
            }
            ans = ans + tmp;
        }
        ans.print();
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Crazy Thairs【树状数组+高精度+DP思想】 的相关文章

  • 【http】10,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE]

    1 概述 本日使用http远程连接获取远程接口信息报错 10 000 milliseconds timeout on connection http outgoing 0 ACTIVE 022 12 23 09 54 15 181 ERRO
  • C潜规则篇之防止重定义

    C程序编译时常出现类似xxx redefinition错误 除了模块间的命名冲突 命名污染及static 问题多数与头文件管理有关 大型C工程的头文件管理很麻烦 C源文件往往包含很多头文件 头文件又包含其他头文件 形成复杂的嵌套包含 C没有
  • Android 逆向工程,反编译心得

    前言 apk的反编译是我们在Android开发中绕不开的一个坎 对于反编译这门技术 我们应该抱着学习的态度 学的越多 也越能防备别人反编译我们 这就是所谓的知己知彼吧 哈哈 需要准备的工具 Apktool 解包和重新打包都需要它 dex t

随机推荐

  • 在什么情况下、使用python类的使用-使用Python编程时的10个注意事项

    原标题 使用Python编程时的10个注意事项 1 初始变化量 在Python里 一个表达式中的名字在它被赋值之前是没法使用的 这是有意而为的 这样能避免一些输入失误 同时也能避免默认究竟应该是什么类型的问题 0 None 记住把计数器初始
  • iOS Provisioning Profile(Certificate)与Code Signing详解

    引言 关于开发证书配置 Certificates Identifiers Provisioning Profiles 相信做iOS开发的同学没少被折腾 对于一个iOS开发小白 半吊子 比如像我自己 抑或老兵 或多或少会有或曾有过以下不详 疑
  • “Intel VT-x处于禁用状态”如何处理

    在安排虚拟机时 出现Intel VT x处于禁用状态时 第一步 进入bios页面 就是重装系统的那个页面 有的电脑是F1 F2 F10 F12 具体多少上网查查就行了 将intel Virtual Technology改成enabled 第
  • 回调函数&&回调机制

    所谓回调 定义是 一个方法的指针传递给事件源 当某一事件发生时用来调用这个方法 比如客户程序C调用服务程序S中的某个函数A 然后S又在某个时候反过来调用C中的某个函数B 对于C来说 这个B便叫做回调函数 例如Win32下的窗口过程函数就是一
  • 如何写CSDN博客

    如何写CSDN博客 我这里使用Typora软件先将博客写好 这个软件可以去应用商城下载 写好以后我们打开CSDN博客网页 找到创作中心的写文章 然后我们会找到导入 找到我们要选择发布的博客 导入后我们发现博客里的图片图片导入失败 我们需要手
  • Kappa 与 Lambda 架构介绍与对比

    Lambda 架构 Lambda 架构由Storm的作者Nathan Marz提出 其设计目的在于提供一个能满足大数据系统关键特性的架构 包括高容错 低延迟 可扩展等 其整合离线计算与实时计算 融合不可变性 读写分离和复杂性隔离等原则 可集
  • Ubuntu mysql配置root用户远程登录

    查看mysql默认密码登录数据库 cat etc mysql debian cnf 查看root用户数据 use mysql select User Host authentication string from user 增加root用户
  • Android中Context详解 ---- 你所不知道的Context

    大家好 今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友 Context类 说它熟悉 是应为我们在开发中 时刻的在与它打交道 例如 Service BroadcastReceiver Activity等都会利用到Context的相关方法
  • AngularJS 2调用.net core WebAPI的几个坑

    前几天 按照AngularJS2的英雄指南教程走了一遍 教程网址是http origin angular live docs ts latest tutorial 在步骤完成后 又更进一步 在英雄增删改的时候 直接调用 net core的W
  • 关于 clock_gettime() 的一个问题以及解决方法

    在新的2 6x内核上 编译使用这个函数的程序的时候 会发现 如果 gcc lpthead 无法链接成功 原因在于 libpthread so中没有这个函数的实现 但是 libpthread a中有 还有一个librt so librt a中
  • 堆和栈的通俗解释【转】

    数据结构的栈和堆 首先在数据结构上要知道堆栈 尽管我们这么称呼它 但实际上堆栈是两种数据结构 堆和栈 堆和栈都是一种数据项按序排列的数据结构 栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧 它是一种具有后进先出性质的数据结构 也就是
  • 医院RFID药物跟踪管理解决方案

    1 技术背景 基于 2018年2月6日 药物调配商QuVa Pharma 与Kit Check合作 为其医院药房客户 提供基于RFID药物跟踪管理解决方案 QuVa提供的系统包括Kit Check的 无源 超高频 UHF RFID 标签 该
  • WEB基础-变形动画

    字体图标 IconFont 图标字体也叫字体图标 就是字体做的图标 可以通过设置字体的方式改变图标的样式 受到近些年 扁平化设计 的影响 越来越多的图标都开始使用 IconFont 下载字体图标 首先打开IconFont 阿里巴巴矢量图标库
  • websocket详解

    之前利用websocket以及jQuery做了一个聊天通讯应用 最近在总结整个过程中的一些问题 也借此机会聊聊websocket协议 webSocket本身不存在跨域问题 所以可以利用webSocket来进行非同源之间的通信 webSock
  • pytorch打印模型梯度

    简介 有时候在调试模型训练过程时 我们需要打印模型中参数的梯度 去查看是否存在梯度消失或者梯度爆炸的问题 可以通过在backward之后查看params的grad属性来确认 参考代码如下所示 import torch 定义模型 class
  • Python3 面向对象编程

    好记性不如烂笔头 对之前阅读书籍进行梳理与总结 此文为 Python3面向对象编程 阅读笔记 文章目录 第一章 面向对象设计 第二章 Python对象 第三章 对象相似时 第四章 异常捕获 第五章 何时使用面向对象编程 第六章 Python
  • C# 导出 Excel 方法

    第一种 使用 Microsoft Office Interop Excel dll public void ExportExcel DataTable dt if dt null Microsoft Office Interop Excel
  • 关键词生成器在线-在线免费关键词生成器

    关键词生成 什么是关键词生成 关键词生成就是根据你输入的一个关键词生成成千上百的核心关键词 围绕着你输入的核心词来生成的 优先生成大量用户搜索的关键词 今天就给大家分享一款免费关键词生成工具 关键词生成的来源主要是用户都在搜索的词 相关搜索
  • CentOS-8-x86_64-1905安装

    CentOS 8 x86 64 1905安装 安装前准备 VMware Workstation 点击下载虚拟机软件 VMware Workstation是一款功能强大的桌面虚拟计算机软件 提供用户可在单一的桌面上同时运行不同的操作系统 和进
  • Crazy Thairs【树状数组+高精度+DP思想】

    题目链接 POJ 3378 题意 有N个点 问的是要求组成一个长度为5的上升子序列的组成有多少种 最搞事情的是这道题不用取模 所以 是一定会爆long long的 首先 很容易想到一点就是我们可以开一个dp maxN 5 表示的是 dp i