poj 3378 pascal

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.

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 和适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager 和 CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值