[POJ 3378] Crazy Thairs
Link:
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的更多相关文章
- ●POJ 3378 Crazy Thairs
		题链: http://poj.org/problem?id=3378 题解: 树状数组维护,高精度. 依次考虑以每个位置结尾可以造成的贡献. 假设当前位置为i,为了达到5个元素的要求,我们需要求出,在 ... 
- POJ 3378 Crazy Thairs(树状数组+DP)
		[题目链接] http://poj.org/problem?id=3378 [题目大意] 给出一个序列,求序列中长度等于5的LIS数量. [题解] 我们发现对于每个数长度为k的LIS有dp[k][i] ... 
- poj 3378 Crazy Thairs  dp+线段树+大数
		题目链接 题目大意: 给出n个数, 让你求出有多少个5元组满足 i < j < k < l < m并且ai < aj < ak < al < am 我们 ... 
- 【POJ】3378 Crazy Thairs(树状数组+dp+高精)
		题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了, ... 
- [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)
		树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ... 
- poj 1200 Crazy Search(hash)
		题目链接:http://poj.org/problem?id=1200 思路分析:从数据来看,该题目使用线性时间算法,可见子串的比较是不可能的:使用hash可以在常数时间内查找,可以常数时间内判重, ... 
- POJ 1200 Crazy Search(字符串简单的hash)
		题目:http://poj.org/problem?id=1200 最近看了一个关于hash的问题,不是很明白,于是乎就找了些关于这方面的题目,这道题是一道简单的hash 字符串题目,就先从他入手吧. ... 
- POJ – 1200 Crazy Search
		http://poj.org/problem?id=1200 #include<iostream> #include<cstring> using namespace std; ... 
- poj 3378 二维树状数组
		思路:直接用long long 保存会WA.用下高精度加法就行了. #include<map> #include<set> #include<cmath> #inc ... 
随机推荐
- 【转载】全面解析Unity3D自动生成的脚本工程文件
			我们在Unity3D开发的时候,经常会看到它会产生不少固定命名工程文件,诸如: Assembly-CSharp-vs.csproj Assembly-CSharp-firstpass-vs.csp ... 
- websocket+nodejs+redis实现消息订阅和发布系统
			其实我很懒,不想打字,代码已上传到码云,请点此处. 有疑问请一下扫描二维码,加我微信: 
- Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)
			为了梦想与了信仰 开局一张图 主要三个方面: 1.Linux终端命令 2.MySQL语句 3.Python调用 先删库 再跑路..... ... 
- 【bzoj3144】[Hnoi2013]切糕  网络流最小割
			题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ... 
- easyui中datagrid空数据集不刷新的解决方式
			datagrid空间可以异步请求json数据,并将新数据覆盖原有数据,重绘数据表. 但是当回来空数据集的时候,js会产生这样一条错误: TypeError: rows is null for(var ... 
- [bzoj] 3343 教主的魔法 || 带修改分块
			原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ... 
- freemarker的简单入门程序
			本文主要介绍了freemarker的常用标签<#list> <#import> <#assign> <#if> <#else> &l ... 
- bzoj 3507 DP+哈希
			[Cqoi2014]通配符匹配 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 541 Solved: 235[Submit][Status][Dis ... 
- Linux Ubuntu mysql 乱码
			进入mysql后,敲入命令status,就可以看到mysql的字符编码问题. 默认如下: Server characterset: latin1 Db characterset: lat ... 
- 【Start From Here】HNOI2018 滚粗记
			萌新Backup的博客生涯开始了,请多多指教- PS:应该没有哪个蛇皮拿省选游记做第一篇博客吧. Day 0 emm配置熟到不用背,就一直在想接下来两天会被怎样花式吊打.. 心疼Brave_Cattl ... 
