POJ3378_Crazy Thairs
这个题目很有意思,也是一个很好的题目,涉及的知识点比较广,要求较高。
题目是这样的,给定你一个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的更多相关文章
- [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)
树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...
- poj 3378 Crazy Thairs dp+线段树+大数
题目链接 题目大意: 给出n个数, 让你求出有多少个5元组满足 i < j < k < l < m并且ai < aj < ak < al < am 我们 ...
- ●POJ 3378 Crazy Thairs
题链: http://poj.org/problem?id=3378 题解: 树状数组维护,高精度. 依次考虑以每个位置结尾可以造成的贡献. 假设当前位置为i,为了达到5个元素的要求,我们需要求出,在 ...
- [POJ3378]Crazy Thairs
Problem 给你一个数列,让你求由五个元素组成的顺序对的个数. Solution DP:用DP[i][j]表示把第j个作为五元组中第i个的方案数 则DP[i][j]=sum{DP[k][j-1]} ...
- 【POJ】3378 Crazy Thairs(树状数组+dp+高精)
题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了, ...
- POJ 3378 Crazy Thairs(树状数组+DP)
[题目链接] http://poj.org/problem?id=3378 [题目大意] 给出一个序列,求序列中长度等于5的LIS数量. [题解] 我们发现对于每个数长度为k的LIS有dp[k][i] ...
- [POJ 3378] Crazy Thairs
Link: POJ 3378 传送门 Solution: 按序列长度$dp$, 设$dp[i][j]$为到第$i$个数,符合要求的序列长度为$j$时的序列个数, 易得转移方程:$dp[i][j]=\s ...
随机推荐
- 20155229 2016-2017-2《Java程序设计》课程总结
20155229 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:对专业的期待和对师生关系的理解 预备作业2:分析自我技能延展到c语言学习状况 预备作业3 ...
- 20155321 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 命令行下Java程序开发 打开windows下的cmd → 输入cd Code命令进入 ...
- 20155331 ch02 课下作业
2.96 遵循位级浮点编码规则,实现具有如下原型的函数: /* *Compute (int)f. *If conversion cause overflow or f is NaN, return 0 ...
- ruby学习笔记(3)- 新手入门
这里是一个Ruby开发的快速参考指南: Ruby是什么 ? Ruby是一种纯粹的面向对象编程语言.它由日本松本幸创建于1993年. Ruby是一种通用的解释编程语言如Perl和Python. IRb是 ...
- 【CF613D】Kingdom and its Cities
[CF613D]Kingdom and its Cities 题面 洛谷 题解 看到关键点当然是建虚树啦. 设\(f[x]\)表示以\(x\)为根的子树的答案,\(g[x]\)表示以\(x\)为根的子 ...
- 向大学说拜拜——大学 > 兴趣 + 时间 + 思考 + 实践
[人物素描] 大学期间,担任过班委,加入过学生会,参加过社团,拿过奖学金......而印象最深刻的莫过于参加并组织过ACM集训,以及参加过导师的国家自然科学基金项目了.毕业时顺利拿到一波offer,并 ...
- loadrunner之做压力测试要做的准备
前提B/S架构 1.要有个备库和主库保存一致 到时候做压力测试的时候,要断开主库连接到备库.进行测试.以免主库出现垃圾数据.2.节点 判断单节点能承受多大的压力,如200万的用户账号,10万的在线用户 ...
- linux系统CPU内存磁盘监控发送邮件脚本
#!/bin/bashexport PATHexport LANG=zh_CN.UTF-8###top之后输入数字1,可以查看每颗CPU的情况.###先配置好mailx邮箱账号密码:#cat>/ ...
- Sublime Text 3高效实用快捷键
2017-11-27 16:18:48 Sublime Text 3 高效实用快捷键 Sublime Text 3 软件及注册码 官网下载链接在这里,有时候会很神奇的上不去,可能是因为被Q了,可能就是 ...
- Minimum Sum of Array(map迭代器)
You are given an array a consisting of n integers a1, ..., an. In one operation, you can choose 2 el ...