POJ 3378 Crazy Thairs(数据集中+DP+树状数组+高精度)
2014-03-17 21:03
471 查看
POJ 3378 Crazy Thairs(数据集中+DP+树状数组+高精度)
http://poj.org/problem?id=3378
题意:
有一个N个数组成的数列,问你该数列中有多少上升5元序列,即满足如下要求的序列(不要求连续取5个A):
1 ≤ i < j < k < l < m ≤ N
Ai < Aj < Ak < Al < Am
分析:
由于数据值大量不大,所以读入所有的数应该从新映射到[1,50000]之间。
令d[x][i]=y表示原始数列中的以A[x]结尾的上升i(i为1,2,3,4,5)元序列有y个。
初值d[][]=0
则从左往右读所有的a[i],假设当前读入的a[i]=x,那么d[x][1]=1。有下列递推公式:
d[x][2]=sum{d[y][1] } 其中1<=y<x 且A[y]<A[x]
d[x][3]=sum{d[y][2] } 其中1<=y<x 且A[y]<A[x]
d[x][4]=sum{d[y][3] } 其中1<=y<x 且A[y]<A[x]
d[x][5]=sum{d[y][4] } 其中1<=y<x 且A[y]<A[x]
由于y的值是1到最多4999,所以每次都循环这么多次去加明显不行,所以要用树状数组维护d值(且需要动态的更新,即当插入A[3]时,需要依次更新d[3][1],d[3][2],d[3][3],d[3][4],d[3][5])。建5个树状数组c[6][MAXN],每个数组维护一个d[],当新读入一个数x时,在c[1]的树中执行add(1,x,1),在c[2]树中先执行
add(2,x,sum(1,x-1)),依此类推。
在第i颗树执行add(i,x,sum(i-1,x-1)) .
最终的结果就是sum(5,MAXN)(或sum(5,n)也行,如果重新映射的值最大为n).
但是此题用long long 也不行,需要用高进度类来保存计算结果。
AC代码:1023ms,使用了高精度类,注意普通10进制高精度会超时,由于这题目只需要加法计算,所以用10000进制的高精度才行.
http://poj.org/problem?id=3378
题意:
有一个N个数组成的数列,问你该数列中有多少上升5元序列,即满足如下要求的序列(不要求连续取5个A):
1 ≤ i < j < k < l < m ≤ N
Ai < Aj < Ak < Al < Am
分析:
由于数据值大量不大,所以读入所有的数应该从新映射到[1,50000]之间。
令d[x][i]=y表示原始数列中的以A[x]结尾的上升i(i为1,2,3,4,5)元序列有y个。
初值d[][]=0
则从左往右读所有的a[i],假设当前读入的a[i]=x,那么d[x][1]=1。有下列递推公式:
d[x][2]=sum{d[y][1] } 其中1<=y<x 且A[y]<A[x]
d[x][3]=sum{d[y][2] } 其中1<=y<x 且A[y]<A[x]
d[x][4]=sum{d[y][3] } 其中1<=y<x 且A[y]<A[x]
d[x][5]=sum{d[y][4] } 其中1<=y<x 且A[y]<A[x]
由于y的值是1到最多4999,所以每次都循环这么多次去加明显不行,所以要用树状数组维护d值(且需要动态的更新,即当插入A[3]时,需要依次更新d[3][1],d[3][2],d[3][3],d[3][4],d[3][5])。建5个树状数组c[6][MAXN],每个数组维护一个d[],当新读入一个数x时,在c[1]的树中执行add(1,x,1),在c[2]树中先执行
add(2,x,sum(1,x-1)),依此类推。
在第i颗树执行add(i,x,sum(i-1,x-1)) .
最终的结果就是sum(5,MAXN)(或sum(5,n)也行,如果重新映射的值最大为n).
但是此题用long long 也不行,需要用高进度类来保存计算结果。
AC代码:1023ms,使用了高精度类,注意普通10进制高精度会超时,由于这题目只需要加法计算,所以用10000进制的高精度才行.
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> using namespace std; const int MAXN= 50000+100; //**************高精度类模板************** const int N = 50010; const int Base = 10000; typedef long long LL; class BigNum { public: int num[7], len; BigNum():len(0) {} BigNum(int n):len(0) { for( ; n > 0; n /= Base) num[len++] = n%Base; } BigNum Bigvalueof(LL n) { len = 0; while(n) { num[len++] = n%Base; n /= Base; } return *this; } BigNum operator + (const BigNum& b) { //++ BigNum c; int i, carry = 0; for(i = 0; i < this->len || i < b.len || carry > 0; ++i) { if(i < this->len) carry += this->num[i]; if(i < b.len) carry += b.num[i]; c.num[i] = carry%Base; carry /= Base; } c.len = i; return c; } BigNum operator += (const BigNum& b) { //+= *this = *this + b; return *this; } void Print() { if(len == 0) {puts("0"); return ;} printf("%d", num[len - 1]); for(int i = len - 2; i >= 0; --i) { for(int j = Base/10; j > 0; j /= 10) { printf("%d", num[i]/j%10); } } puts(""); } }; typedef BigNum bign; //**************高精度类模板************** struct node { int v;//每个数的初始值 int index;//每个数的初始位置 bool operator <(const node&b)const { return v<b.v; } }nodes[MAXN]; int a[MAXN];//用来保存映射后的数组 bign c[6][MAXN]; int lowbit(int x) { return x&(-x); } bign sum(int i,int x) { bign res=0; while(x>0) { res+=c[i][x]; x -=lowbit(x); } return res; } void add(int i,int x,bign v) { while(x<MAXN) { c[i][x] +=v; x+=lowbit(x); } } int main() { int n; while(scanf("%d",&n)==1&&n) { for(int i=1;i<=n;i++)//从1到n { scanf("%d",&nodes[i].v); nodes[i].index=i; } sort(nodes+1,nodes+n+1); int max_num=0;//表示当前重新映射后的最大值 a[nodes[1].index]=++max_num; for(int i=2;i<=n;i++) { if(nodes[i].v==nodes[i-1].v) a[nodes[i].index]=max_num; else a[nodes[i].index]=++max_num; } //for(int i=1;i<=n;i++)//映射后的数组也是从1到n //printf("%d ",a[i]); for(int i=1;i<=5;i++) for(int j=1;j<=n+10;j++) c[i][j]=0; for(int i=1;i<=n;i++) { int x=a[i]; add(1,x,bign(1)); for(int j=2;j<=5;j++) add(j,x,sum(j-1,x-1)); } sum(5,n).Print(); } return 0; }
相关文章推荐
- 【转】POJ 3378 Crazy Thairs(数据集中+DP+树状数组+高精度)
- POJ 3378——Crazy Thairs(树状数组+dp+高精度)数据结构优化的DP
- poj3378 Crazy Thairs 高精度,树状数组
- POJ 3378 - Crazy Thairs 树状数组+dp+离散化+高精度..
- poj 3378 Crazy Thairs 树状数组+高精度+dp
- poj 3378 Crazy Thairs
- POJ 3378 树状数组+DP+离散化+高精度
- poj 3378 Crazy Thairs
- poj 3378 Crazy Thairs
- poj 3378 Crazy Thairs 动态规划
- POJ 3378 Crazy Thairs(树状数组优化)
- ●POJ 3378 Crazy Thairs
- POJ 3378 Crazy Thairs(树状数组+DP)
- POJ 3378 / UESTC 1460 - Crazy Thairs
- POJ3378_Crazy Thairs
- (Relax 线段树1.1)POJ 3468 A Simple Problem with Integers(线段树子区间更新的维护:集中更新和动态统计子序列中的数据)
- 招标:湖南省财政厅数据集中存储及本地容灾系统建设
- poj&nbsp;1001&nbsp;Exponentiation&nbsp;高精度
- .NET中,修改DateSet.xsd数据集中TableAdapter的超时设置的方法(转自:股海无涯)
- POJ 3331 The Idiot of the Year Contest! 高精度阶乘