关闭

poj 3378 Crazy Thairs

标签: 线段树poj
240人阅读 评论(3) 收藏 举报
分类:
题目大意
  给一个长度为n的序列ai,定义五元组(i,j,k,l,m)满足:
  1<=i<j<k<l<m<=n;
  ai<aj<ak<al<am;
  问序列中有多少个满足条件的五元组。
  数据范围:1 <= n <= 50000, 0 <= ai <= 109

分析
  算法分析
ª 首先可以想到一个简单的dp方程
  设f[i][j]表示从前i个数中选择j个数且第j个数为a[i]的种数,则
  f[i][j] = f[i’][j - 1],  0 < i’ < i 且 a[i’] < a[i]
  直接作的时间复杂度是O(5 * n ^ 2)
ª 转移的时候其实是转移sum(f[i’][j-1]), 0 < i’ < i, 且a[i’] < a[i],具有区间性。
ª 利用树状数组优化转移时间复杂度
  最后一次要用高精度!!!
  可能会有重复的数。

代码
type
  arr=array[0..100] of int64;

var
  n,m:longint;
  b:array[0..109000,0..5] of int64;
  a1,b1,c2:arr;
  a,c,c1:array[0..100000] of int64;
  i,j:longint;
  k:int64;
  s:char;

procedure qsort(l,r:longint);
var
  i,j,key,temp:longint;
begin
  if l>=r then exit;
  i:=l;j:=r;
  key:=a[l+random(r-l+1)];
  repeat
    while (a[i]<key) do inc(i);
    while (a[j]>key) do dec(j);
    if i<=j then
      begin
        temp:=a[i];a[i]:=a[j];a[j]:=temp;
        temp:=c[i];c[i]:=c[j];c[j]:=temp;
        inc(i);dec(j);
      end;
  until i>j;
  qsort(l,j);
  qsort(i,r);
end;

function ji(a,b:arr):arr;
var
  i,j,k:longint;
  jia:arr;
begin
  fillchar(jia,sizeof(jia),0);
  if a[0]>b[0] then jia[0]:=a[0]
               else jia[0]:=b[0];
  for i:=1 to jia[0] do
    begin
      jia[i]:=jia[i]+a[i]+b[i];
      jia[i+1]:=jia[i] div 10;
      jia[i]:=jia[i] mod 10;
    end;
  if jia[jia[0]+1]>0
    then inc(jia[0]);
  ji:=jia;
end;

procedure add(x:qword);
var
  i,j,k:longint;
begin
  i:=1;
  fillchar(c2,sizeof(c2),0);
  c2:=a1;
  fillchar(a1,sizeof(a1),0);
  fillchar(b1,sizeof(b1),0);
  while x<>0 do
    begin
      b1[i]:=x mod 10;
      x:=x div 10;
      i:=i+1;
    end;
  b1[0]:=i-1;
  if b1[0]=0 then b1[0]:=1;
  a1:=ji(b1,c2);
end;

procedure bian1(p:int64;c:int64;j:longint);
begin
  while p<=n do
    begin
      b[p,j]:=b[p,j]+c;
      p:=p+(p and (p xor (p-1)));
    end;
end;

function tong1(p:int64;j:longint):int64;
begin
  tong1:=0;
  while p>0 do
    begin
      tong1:=tong1+b[p,j];
      p:=p-(p and (p xor (p-1)));
    end;
end;

begin
  while not eof do
  begin
  readln(n);
  fillchar(a,sizeof(a),0);
  fillchar(c,sizeof(c),0);
  fillchar(c1,sizeof(c1),0);
  fillchar(a1,sizeof(a1),0);
  fillchar(b,sizeof(b),0);
  for i:=1 to n do
    begin
      read(a[i]);
      c[i]:=i;
    end;
  readln;
  qsort(1,n);
  j:=0;
  c1[c[1]]:=1;
  for i:=1 to n do
    begin
      if a[i]=a[i-1]
        then
          c1[c[i]]:=c1[c[i-1]]
        else
          begin
            c1[c[i]]:=j+1;
            j:=j+1;
          end;
    end;
  for i:=1 to n do
    begin
      add(tong1(c1[i]-1,4));
      for j:=5 downto 2 do
        begin
          k:=tong1(c1[i]-1,j-1);
          bian1(c1[i],k,j);
        end;
      bian1(c1[i],1,1);
    end;
  for i:=a1[0] downto 1 do
    write(a1[i]);
  writeln;
  end;
end.


1
0
查看评论

poj 3378 Crazy Thairs

题意/Description:     These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ≤ N ≤ 50000) numbers, whic...
  • peter_zhu01
  • peter_zhu01
  • 2016-05-31 16:48
  • 273

poj 3378 Crazy Thairs 动态规划

题目链接:http://poj.org/problem?id=3378   题目大意:       找出原序列中满足: 1. 1 ≤ i  2. Ai j k l...
  • SG_SIQing
  • SG_SIQing
  • 2013-10-13 20:47
  • 445

poj 3378 Crazy Thairs dp

用树状数组优化转移复杂度,结果会超long long,要用高精度。#include #include #include #include typedef unsigned long long ll; using namespace std; const int maxn=5e4+9; ll ...
  • yrleep
  • yrleep
  • 2013-05-04 02:18
  • 878

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

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

POJ 3378 / UESTC 1460 - Crazy Thairs

UESTC 地址 :   http://acm.uestc.edu.cn/problem.php?pid=1460 POJ 地址 : http://poj.org/problem?id=3378        ...
  • diannaok
  • diannaok
  • 2012-07-28 13:10
  • 556

[PKU 3378]Crazy Thairs(平衡树)

【题目大意】:N个数(N),求5个互相不逆序的数的组合有多少个。【题目分析】:这个题的重要的地方在于要统计的是长度为5的正序序列的个数,我们就可以通过正序对个数的求法来类比出来正确的方法。正序的求法我们是在平衡树中记录size,通过rank操作来进行的。其实进行一下扩展就可以得到正确的方法。我们开4...
  • Skyprophet
  • Skyprophet
  • 2009-09-08 12:32
  • 643

POJ 3378 - Crazy Thairs 树状数组+dp+离散化+高精度..

题意:                        给了一个数列,长度为N(1               ...
  • kk303
  • kk303
  • 2013-10-04 17:33
  • 1168

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

转自:http://blog.csdn.net/u013480600/article/details/21407795 POJ 3378 Crazy Thairs(数据集中+DP+树状数组+高精度) http://poj.org/problem?id=3378 题意:  ...
  • sdau20163942
  • sdau20163942
  • 2017-08-24 11:47
  • 91

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

POJ3378 Crazy Thairs(数据集中+DP+树状数组+高精度) 分析:由于数据值大量不大,所以读入所有的数并对数值从新映射到[1,5000]. 令d[x][i]=y表示在序列中以值x结尾,且x是作为升序5元组中的第i(i为1,2,3,4,5)个元素时,有y种可能. 初值d[][]=0 ...
  • u013480600
  • u013480600
  • 2014-03-17 21:03
  • 1097

poj3378 Crazy Thairs

求s序列连续定长子序列的个数(len=5) 1.状态dp[i][j]:长度为i以第j个元素结尾的定长子序列个数 2.状态转移方程:dp[i][j]=sum{dp[i-1][k],s[k] 3.优化:求dp[i-1]数组前j-1项中比s[j]小的元素个数---树状数组。 树状数组的应用之一:求...
  • u013514182
  • u013514182
  • 2014-12-25 13:06
  • 202
    个人资料
    • 访问:62521次
    • 积分:3443
    • 等级:
    • 排名:第11509名
    • 原创:249篇
    • 转载:6篇
    • 译文:2篇
    • 评论:300条