Link:

POJ 3378 传送门

Solution:

按序列长度$dp$,

设$dp[i][j]$为到第$i$个数,符合要求的序列长度为$j$时的序列个数,

易得转移方程:$dp[i][j]=\sum_{k=1}^{i-1} dp[k][j-1] (dat[k]<dat[i])$

用树状数组按$dat[i]$为坐标来维护$dp[i][j-1]$的值即可,

由于$dat[i] \le 1e9$,记得离散化,同时答案超过$long long$,要高精度

这里可以选择开5个树状数组,也可以只用一个树桩数组,每次维护$dp[][j-1]$的值后清空

由于此题卡空间,推荐我用的第二种

如果要用第一种,要用到高精度的一些黑科技,改为10000进制,这样只要7位就行了Orz

10000进制的输出:

void Print()
{
if(len==) {puts("");return;}
printf("%d", num[len - ]);
for(int i=len-;i>=;--i)
for(int j=Base/;j>;j/=)
printf("%d", num[i]/j%);
puts("");
}

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std;
const int MAXN=5e4+;
int T,dsp[MAXN],n,dat[MAXN],tot=; struct BI //高精度类
{
int d[],len; BI() {memset(d,,sizeof(d));len=;}
void clean(){memset(d,,sizeof(d)),len=;}
BI(int num) {*this=num;} BI& operator = (const int& num)
{
memset(d,,sizeof(d));
int temp=num;len=;
while(temp)
d[++len]=temp%,temp/=;
return *this;
} BI operator + (const BI& num)
{
BI ret;ret=*this;
ret.len=max(len,num.len);
for(int i=;i<=ret.len;i++)
{
ret.d[i]+=num.d[i];
if(ret.d[i]>=)
ret.d[i]-=,ret.d[i+]++;
}
if(ret.d[ret.len+]) ret.len++;
return ret;
}
BI operator += (const BI& num){*this=*this+num;return *this;}
void print(){for(int i=len;i>=;i--) printf("%d",d[i]);}
}bit[MAXN],dp[MAXN][],res; void Update(int pos,BI val){while(pos<=n) bit[pos]+=val,pos+=pos&(-pos);}
BI Query(int pos)
{
BI ret=; //记得初始化
while(pos) ret+=bit[pos],pos-=pos&(-pos);
return ret;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++) scanf("%d",&dat[i]),dsp[i]=dat[i]; //离散化
sort(dsp+,dsp+n+);tot=unique(dsp+,dsp+n+)-dsp-;
for(int i=;i<=n;i++) dat[i]=lower_bound(dsp+,dsp+tot+,dat[i])-dsp; res.clean();
for(int i=;i<n+;i++) for(int j=;j<;j++) dp[i][j].clean();
for(int i=;i<=n;i++) dp[i][]=(BI);
for(int i=;i<=;i++)
{
for(int j=;j<tot+;j++) bit[j].clean();
for(int j=;j<=n;j++)
dp[j][i]=Query(dat[j]-),Update(dat[j],dp[j][i-]);
}
for(int i=;i<=n;i++) res+=dp[i][];
res.print();puts("");
}
return ;
}

Review:

一道比较常规的题吧,用到了离散化和高精度的一些套路

(1)如果$dp$复杂度有问题,可以向单调性/斜率优化/RMQ维护上想一想

(2)犯的丝帛错误:

$Query$函数里的$ret$要预处理!!!

(3)黑科技:高精度空间不够时转为更高进制(10000进制)

[POJ 3378] Crazy Thairs的更多相关文章

  1. ●POJ 3378 Crazy Thairs

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

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

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

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

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

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

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

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

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

  6. poj 1200 Crazy Search(hash)

    题目链接:http://poj.org/problem?id=1200 思路分析:从数据来看,该题目使用线性时间算法,可见子串的比较是不可能的:使用hash可以在常数时间内查找,可以常数时间内判重, ...

  7. POJ 1200 Crazy Search(字符串简单的hash)

    题目:http://poj.org/problem?id=1200 最近看了一个关于hash的问题,不是很明白,于是乎就找了些关于这方面的题目,这道题是一道简单的hash 字符串题目,就先从他入手吧. ...

  8. POJ – 1200 Crazy Search

    http://poj.org/problem?id=1200 #include<iostream> #include<cstring> using namespace std; ...

  9. poj 3378 二维树状数组

    思路:直接用long long 保存会WA.用下高精度加法就行了. #include<map> #include<set> #include<cmath> #inc ...

随机推荐

  1. 孤荷凌寒自学python第五十一天初次尝试使用python连接Firebase数据库

    孤荷凌寒自学python第五十一天初次尝试使用python连接Firebase数据库 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库服 ...

  2. heat launch an instance

    在包含Orchestration服务的环境中,可以创建启动实例的堆栈 创建yam文件 heat_template_version: 2015-10-15 description: Launch a b ...

  3. C#读取xml文件写入到TreeView中

    开发过程中我们会遇到一些读取xml文件的时候,下面是我学习的整理. 用XmlDocument读取加载 XmlDocument doc = new XmlDocument(); doc.Load(&qu ...

  4. json字符串数组判断其中

    嘴挺笨的描述不清,直接看图,console.log(data1)是下图 获取的table中的数据组成的json对象(这里我不明白json对象啊json字符串啊json数组啊.我只会- 需要啥就转换成啥 ...

  5. OAuth2.0 用户验证授权标准 理解

    OAuth2.0是一套标准. 一.问题 这个标准解决了这样的一个问题. 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.  ...

  6. BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】

    题目链接 BZOJ2535 题解 航班之间的关系形成了一个拓扑图 而且航班若要合法,应尽量早出发 所以我们逆拓扑序选点,能在后面出发的尽量后面出发,不会使其它点变得更劣,容易知是正确的 第二问只需枚举 ...

  7. linux——rhel安装yum

    在进行下面的操作之前,一定要确保网络正常,如果没有网络,下面的所有操作一个都不能实现.(下次会写个本地源的配置,这个就可以离线的状态下进行,需要用到系统的镜像文件,安装好系统之后不要删掉.) 首先配置 ...

  8. Python实现队列

    队列的数据结构的主要结构:一个结点类和两个方法:出队列和进队列 class Node(object): def __init__(self,val): self.val = val self.next ...

  9. es6+最佳入门实践(4)

    4.函数扩展 4.1.参数默认值 默认参数就是当用户没有传值的时候函数内部默认使用的值,在es5中我们通过逻辑运算符||来实现 function Fn(a, b) { b = b || "n ...

  10. 结构型设计模式之桥接模式(Bridge)

    结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...