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 ...
随机推荐
- 【转载】GC基本算法及C++GC机制
原文: GC基本算法及C++GC机制 阅读目录 前言 基本概念 有向可达图与根集 三种基本的垃圾收集算法及其改进算法 1.引用计数算法 2. Mark & Sweep 算法 3. 节点复制算法 ...
- MySQL入门篇(四)之MySQL主从复制
一.MySQL主从复制原理 随机站点访问量的鞥集啊,单台的MySQL服务器压力也不断地增加,此时需要对MySQL进行优化,如果在MySQL优化无明显改善时期,可以使用高可用.主从复制.读写分离.分库分 ...
- itop4412学习-超级块操作
1. 先看下超级块支持的函数列表,文件路径\4412_SCP精英版\Android源码\iTop4412_Kernel_3.0_20140521\iTop4412_Kernel_3.0\include ...
- 使用GUI工具高效构建你自己的Nuget包
写这篇文章的原因是我在学习构建nuget包的时候,发现了一个官方推荐的GUI工具,而官方的工具介绍文章已经过时,一些地方和现在最新版本的工具有些差异,所以特意利用假期最后一个下午写下来,希望能帮助更多 ...
- NO.3:自学python之路------集合、文件操作、函数
引言 本来计划每周完成一篇Python的自学博客,由于上一篇到这一篇遇到了过年.开学等杂事,导致托更到现在.现在又是一个新的学期,春天也越来越近了(冷到感冒).好了,闲话就说这么多.开始本周的自学Py ...
- 二分图最大匹配模版 m√(n) 复杂度
周大爷在比赛中搜到的黑科技二分图模版,复杂度为m√(n): 注意:点的序号要从0开始! 需要把nx,ny都赋值为n(点数) ; *; struct Edge { int v; int next; } ...
- 网络安全攻防----html基础
一.学习html的硬件条件 网页(.Html)是静态的,学习html语言需要选择Chrome浏览器和Sublime3编辑器,选择Chrome浏览器是因为Chrome浏览器兼容性比较好,支持各种各样的插 ...
- Hyper-V虚拟机联网设置
转自:http://www.3lian.com/edu/2012/12-22/50492.html Windows 8中内置的Hyper-V管理器可以说给许多人带来了惊喜!在Hyper-V管理器强大的 ...
- arcgis10.2怎么把地理坐标系转化为投影坐标系(平面,米制坐标) arcmap 10.2 从 WGS_1984 转 Beijing_1954
方法一:在Arcmap中转换:从 WGS_1984 转 Beijing_19541.加载要转换的数据,右下角为经纬度2.点击视图——数据框属性——坐标系统3.导入或选择正确的坐标系(如选:Beijin ...
- Python 装饰器Decorator(二)
对于上一篇“”Python闭包“”随笔中提到的make_averager()函数的如下实现,我们把历史值保存在列表里,每次计算平均值都需要重新求和,当历史值较多时,需要占用比较多的空间并且效率也不高. ...