这个题目很有意思,也是一个很好的题目,涉及的知识点比较广,要求较高。

题目是这样的,给定你一个n个数的数列,问你有多少个长度为5的上升序列。

首先看到有50000,我们就知道肯定不会是DP。(但是不知道为什么我居然在DP优化这个章节里面做到了这个题)

由于给的数是在int范围里面的,我们需要首先将其离散化,这样相当于每个数的范围只有5000了。

剩下的就是这个题目的最最精华的地方了。

其实这里的统计是用树状数组来实现的。但是不是单单由一个树状数组实现的,而是5个。

什么意思呢?我们用f[i][j]表示不大于j的长度为i的上升序列有多少个。

这样就是一个递推了哦。而对于每一个查询我们都是通过树状数组来实现的,每次查询前面每一个长度,然后加入当前这个数字,这样每次操作的时间复杂度都是O(n*log(n))。

这样答案就呼之欲出了。

但是,你确定?

自己算一下就会发现,如果给你的数为50000个上升的数字,你的程序就直接跪了。

什么意思呢?你可以算一算,C(50000,5)> 2^64,也就是说超过了long long的范围。

这个嘛,有点那个啥。

不过我们可以这样做,保存和更新的只需要是长度为4的有多少个,C(50000,4)是不会超的。这样对于最后一次加法,直接用一个高精度数组保存答案和输出就可以了。

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 50500
#define M 1000000000
using namespace std; typedef long long ll;
struct node{
ll num,pos;
}a[maxn]; struct big{
ll b[],top;
void Clear()
{
memset(b,,sizeof b);
top=;
}
void output()
{
printf("%I64d",b[top]);
for (ll i=top-; i>=; i--) printf("%09I64d",b[i]);
printf("\n");
}
void Add(ll x)
{
ll cur=;
while (x) b[cur++]+=x%M,x/=M;
for (ll i=; i<top; i++) b[i+]+=b[i]/M,b[i]%=M;
while (b[top]>=M) b[top+]+=b[top]/M,b[top]%=M,top++;
}
}ans; ll f[][maxn],g[maxn];
ll n,tep; bool cmp(node n1,node n2) { return n1.num<n2.num; } void rankthem()
{
ll cur=;
for (ll i=; i<=n; i++)
{
if (a[i].num!=a[i-].num) cur++;
g[a[i].pos]=cur;
}
} ll lowbit(ll x) { return x&(-x); } void add(ll u[],ll x,ll v) { while (x<maxn) u[x]+=v,x+=lowbit(x); } ll sum(ll u[],ll x)
{
ll tot=;
while (x) tot+=u[x],x-=lowbit(x);
return tot;
} int main()
{
a[].num=~0U>>;
while (scanf("%I64d",&n)!=EOF)
{
ans.Clear();
for (ll i=; i<=n; i++) scanf("%I64d",&a[i].num),a[i].pos=i;
sort(a+,a++n,cmp);
rankthem();
memset(f,,sizeof f);
for (ll i=; i<=n; i++)
{
ans.Add(sum(f[],g[i]-));
for (ll j=; j>; j--)
{
tep=sum(f[j-],g[i]-);
add(f[j],g[i],tep);
}
add(f[],g[i],);
}
ans.output();
}
return ;
}

POJ3378_Crazy Thairs的更多相关文章

  1. [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)

    树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...

  2. poj 3378 Crazy Thairs dp+线段树+大数

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

  3. ●POJ 3378 Crazy Thairs

    题链: http://poj.org/problem?id=3378 题解: 树状数组维护,高精度. 依次考虑以每个位置结尾可以造成的贡献. 假设当前位置为i,为了达到5个元素的要求,我们需要求出,在 ...

  4. [POJ3378]Crazy Thairs

    Problem 给你一个数列,让你求由五个元素组成的顺序对的个数. Solution DP:用DP[i][j]表示把第j个作为五元组中第i个的方案数 则DP[i][j]=sum{DP[k][j-1]} ...

  5. 【POJ】3378 Crazy Thairs(树状数组+dp+高精)

    题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了, ...

  6. POJ 3378 Crazy Thairs(树状数组+DP)

    [题目链接] http://poj.org/problem?id=3378 [题目大意] 给出一个序列,求序列中长度等于5的LIS数量. [题解] 我们发现对于每个数长度为k的LIS有dp[k][i] ...

  7. [POJ 3378] Crazy Thairs

    Link: POJ 3378 传送门 Solution: 按序列长度$dp$, 设$dp[i][j]$为到第$i$个数,符合要求的序列长度为$j$时的序列个数, 易得转移方程:$dp[i][j]=\s ...

随机推荐

  1. 20155227 2016-2017-2 《Java程序设计》第二周学习总结

    20155227 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 本周学习的第三章内容与以前学过的C语言有很多共通的地方,学习起来还是比较快的. 主要的内容有 ...

  2. 20155308 2016-2017-2 《Java程序设计》实验二 Java面向对象程序设计

    20155308 2016-2017-2 <Java程序设计>实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UM ...

  3. 2017-2018-1 20155319《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155319<信息安全技术>实验二--Windows口令破解 实验环境 试验系统:Windows 2003 实验工具:LC5.SuperDic 实验原理 一.口 ...

  4. 20155325 2016-2017-2 《Java程序设计》第十周学习总结

    教材学习内容总结 Java视频笔记 强制转换 运算符 获取特定位数的值 循环 switch(不能判断布尔型) int x = 3, y = 3, z = 3; int n = 0; switch (x ...

  5. 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询

    [BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...

  6. (二)SpringBoot2.0基础篇- 静态资源的访问及Thymeleaf模板引擎的使用

    一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...

  7. charles录制https请求

    之前一直用windows系统,抓包什么的都是用的fiddler或者wireshark,操作比较简单,扩展性也比较强,现在因为工作原因换了mac,在网上一直没有找到fiddler的mac版本,就只能切换 ...

  8. [Cocos2d-html5]关于压缩

    使用的是2.2版本,压缩时要注意文件顺序,main.js文件最好排在最后一个,避免错误.

  9. javaweb(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  10. github如何删除仓库中文件夹

    github项目中,经常大家更新.添加都非常熟悉,但是如果想要删掉一个文件夹,很多人就不知道怎么操作了. 网上查了一些方法,大部分都是删除仓库重新上传,这样肯定是不行的,首先不说任务量大,而且删除仓库 ...