poj 3378 pascal

原创 2016年05月30日 20:50:15

Description

These days, Sempr is crazed on one problem named Crazy Thair.Given N (1 ≤ N ≤ 50000) numbers, which  are nomore than 109, Crazy Thair is a group of 5 numbers {i, j, k, l, m} satisfying:

1. 1 ≤ i < j < k < l < m  N
2. Ai < Aj < Ak < Al < Am

For example, in the sequence {2, 1, 3, 4, 5, 7, 6},there are fourCrazy Thair groups: {1, 3, 4, 5, 6}, {2, 3, 4, 5, 6}, {1, 3, 4, 5, 7} and {2,3, 4, 5, 7}.

Could you help Sempr to count how many Crazy Thairs in thesequence?

Input

Input contains several test cases. Each test case begins with aline containing a number N,followed by a line containing N numbers.

Output

Output the amount of Crazy Thairs in each sequence.

Sample Input

5
1 2 3 4 5
7
2 1 3 4 5 7 6
7
1 2 3 4 5 6 7

Sample Output

1
4
21
 

题目大意:求长度为5的不下降序列的个数。

分析:一看这题,就想到了一个dp算法。

f[I,j]表示用a[i]结尾的长度为j的序列数目。

F[I,j]= sum(f[k,j-1]) (1<=k<I且a[i]>a[k])        

 

因为时间复杂度太大,为O(N^2)(n<=50000),所以我们应该用树状数组求sum(f[k,j-1]),就可以快速求解。要用高精度求解。

 

const
 maxn=1000;
type
 nd=record
  x,y:longint;
end;

var
dp:array [1..50005,1..5] of int64;
mac,len,i,n,k:longint;
c:array [0..50000] of longint; {表示原数在排序好数列的数列}
s:array [0..50000] of nd;
sum:array [0..maxn] of longint;

procedure qsort(l,r:longint);
  var
    i,j,key,key1:longint;
    temp:nd;
  begin
    if l>=r then exit;
    i:=l;j:=r;
    key:=s[(l+r) shr 1].x;
    key1:=s[(l+r) shr 1].y;
    repeat
      while  (s[i].x<key) or (s[i].x=key) and (s[i].y<key1) do inc(i);
      while  (s[j].x>key) or (s[j].x=key) and (s[j].y>key1) do dec(j);
      if i<=j then
      begin
        temp:=s[i];s[i]:=s[j];s[j]:=temp;
        inc(i);dec(j);
      end;
    until i>j;
    qsort(l,j);
    qsort(i,r);
  end;
procedure add(n:qword);
var i:longint;
    a,b:array [0..maxn] of longint;
begin

 fillchar(a,sizeof(a),0);
 fillchar(b,sizeof(b),0);
 i:=-1;
    while n>0 do
     begin
        inc(i);
        a[i]:=n mod 10;
        n:=n div 10;
     end;
 i:=-1;
    while i<1000 do
     begin
      inc(i);
        b[i]:=a[i]+sum[i]+b[i];
        if b[i]>=10 then
         begin
            inc(b[i+1]);
            b[i]:=b[i] mod 10;
         end;
     end;
    for i:=0 to 999 do
     sum[i]:=b[i];
end;


function bit(n:longint):longint;
begin
    exit(n and -n);
end;

function count(n,j:longint):int64;
var ans:int64;
begin
    ans:=0;
    while n>0 do
    begin
        ans:=ans+dp[n,j];
        n:=n-bit(n);
    end;
    exit(ans);
end;
procedure update(n,j:longint;k:int64);
begin
    while n<=mac do
    begin
        dp[n,j]:=dp[n,j]+k;
        n:=n+bit(n);
    end;
end;
procedure dpp(n:longint);
var tem:int64;
    i,j:longint;
begin
    fillchar(dp,sizeof(dp),0);
    fillchar(sum,sizeof(sum),0);
    len:=1;
    for i:=1 to n do
    begin
     tem:=count(c[i]-1,4);

     add(tem);
        for j:=5 downto 2 do
         begin
            tem:=count(c[i]-1,j-1);
            update(c[i],j,tem);
         end;
        update(c[i],1,1);
    end;
    len:=1000;
    while(sum[len]=0) and (len>0) do
        dec(len);
    for i:=len downto 0 do
        write(sum[i]);
    writeln;
end;
begin
    while not eof do
    begin
     readln(n);
        mac:=n;
        for i:=1 to n do
        begin
            read(s[i].x);
            s[i].y:=i;
        end;
     readln;
         qsort(1,n);
         c[s[1].y]:=1;
         k:=0;
        for i:=1 to n do
        begin
            if(s[i].x=s[i-1].x) then
                c[s[i].y]:=c[s[i-1].y]
            else
             begin
                c[s[i].y]:=k+1;
                inc(k);
             end;
        end;
        dpp(n);
    end;
end.

版权声明:2333

poj 3378 Crazy Thairs 树状数组+高精度+dp

题意: 给一个长为n的序列,求里面长度为5的上升子序列有多少个。 分析: 树状数组c[i][j]表示以i结尾长度为j的序列数量,要用高精度。 代码: //poj 3378 //sep9 #i...
  • sepNINE
  • sepNINE
  • 2014年12月27日 23:08
  • 546

POJ 3378 Crazy Thairs(数据集中+DP+树状数组+高精度)

POJ3378 Crazy Thairs(数据集中+DP+树状数组+高精度) 分析:由于数据值大量不大,所以读入所有的数并对数值从新映射到[1,5000]. 令d[x][i]=y表示在序列中以值x结尾...
  • u013480600
  • u013480600
  • 2014年03月17日 21:03
  • 1088

poj 3378

连续三场吃蛋,感觉压力好大,总结一下,首先英语不好,读题比较吃力,这一点正在努力改变,其次思维有点死了,脑袋里想到一个方法就狂敲,结果狂wa,程序越改越乱,心墙也会随着变化,每次去比赛就是想着不吃蛋,...
  • xymscau
  • xymscau
  • 2011年08月09日 12:44
  • 1172

poj2481-树状数组

这里就是求区间覆盖问题,如果你的区间完全覆盖它的,那么你就比他强壮。求出比自己强壮的牛数。   树状数组: 树状数组是一个查询和修改复杂度都为log(n)的数据结构,假设数组a[1..n], ...
  • zhang20072844
  • zhang20072844
  • 2012年11月15日 01:12
  • 3268

POJ 2311 Cutting Game (SG函数)

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 题目:给出一个N*M的纸片,...
  • ACM_cxlove
  • ACM_cxlove
  • 2012年08月09日 09:27
  • 4150

POJ 3378

题目链接 查找长度为5的上升序列总数 用的树状数组+高精度 用树状数组求在i前面比i小的数有几个 用的4个树状数组,A[i][j]表示长度为i的以j为结尾的个数,A[i][j]=A[i-1][...
  • a593547438
  • a593547438
  • 2013年08月24日 07:37
  • 802

poj 2481 Cows 树状数组解法,详细解析。

Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can...
  • Lionel_D
  • Lionel_D
  • 2015年02月05日 19:30
  • 1138

POJ 2704(Pascal's Travels-裸dp)

Language: Default Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Tot...
  • nike0good
  • nike0good
  • 2013年03月25日 16:56
  • 1241

poj 3378 Crazy Thairs

题意/Description:     These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ≤ N ≤ ...
  • peter_zhu01
  • peter_zhu01
  • 2016年05月31日 16:48
  • 272

POJ2155:Matrix(二维树状数组,经典)

Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in ...
  • libin56842
  • libin56842
  • 2015年06月24日 12:17
  • 2673
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 3378 pascal
举报原因:
原因补充:

(最多只允许输入30个字)