The 2015 China Collegiate Programming Contest -ccpc-c题-The Battle of Chibi(hdu5542)(树状数组,离散化)

摘要:
当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化。今天刚学树状数组还不太会用。下面给出树状数组的模板1intbit[MAX_N+1],n;2intsum3{4ints=0;5while(i˃0)6{7s+=bit[i];8i-=i&-i;9}10returns;11}121314voidadd15{16while17{18bit[i]+=x;19i+=i&-i;20}21}ViewCode为什么要离散化呢,因为N的范围为1000,而所给元素a[i]的范围为1e+9;用树状数组时开不了那么大的数组,所以要离散化,将所给的数对应到1000以内连续的数,这样不会改变每个数之间的大小关系。=b[j-1])46{47cnt++;48my[b[j]]=cnt;49}50else51{52my[b[j]]=cnt;53}54}55}56for57{58a[j]=my[a[j]];59}//将原数组每个元素改为对应元素200100300-〉21360for//要选的个数61{62memset;63for//可以改成从1循不过时间长64{65llnn=sum;66dp[j][k]=nn;67add;68}69}70llendd=0;71for72{73endd=%pp;74}75printf;76printf;77}78return0;79}80llsum81{82lls=0;83while(n˃0)84{85s=%pp;86n=n&(n-1);87}88returns;89}90voidadd91{92while93{94bit[n]=%pp;95n+=;96}97}

当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化(貌似好像现在也不懂)。百度百科——离散化,把无限空间中无限的个体映射到有限的空间中去,以此提高算法的时空效率。

这道题是dp题,离散化和树状数组用来优化,状态转移方程:dp[i][j]=sum(dp[i-1][k])----k需要满足a[j]>a[k]&&k<j;

i表示所要选的个数,j表示以第a[j]个数结尾所有的符合要求的递增串的个数,最后答案就是sum(dp[n][j])--1<=j<=p;n 为要选的个数,p为所给数的总数,这个方程很容易想,这里不说了

(因为叫我说也说不清)。

数据肯定很大所以题目要求取模。

今天刚学树状数组还不太会用。

下面给出树状数组的模板

1 int bit[MAX_N+1],n;
2 int sum(inti)
3 {
4     int s=0;
5     while(i>0)
6 {
7         s+=bit[i];
8         i-=i&-i;
9 }
10     returns;
11 }
12 
13 
14 void add(int i,intx)
15 {
16     while(i<=n)
17 {
18         bit[i]+=x;
19         i+=i&-i;
20 }
21 }
View Code

为什么要离散化呢,因为N的范围为1000,而所给元素a[i]的范围为1e+9;

用树状数组时开不了那么大的数组,所以要离散化,将所给的数对应到1000以内连续的数,这样不会改变每个数之间的大小关系。

那么树状数组就可以开bit[1005];最后复杂度为n2log(n);

下面给出代码

1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<iostream>
6 #include<map>
7 typedef long longll;
8 ll sum(intn);
9 void add(int n,ll kk,intz);
10 ll dp[1005][1005];
11 int a[1005];
12 int b[1005];
13 int bit[1005];//树状数组
14 const ll pp=1e9+7;
15 using namespacestd;
16 int main(void)
17 {
18     intn,i,j,k,p,q;
19     scanf("%d",&n);
20     for(i=1; i<=n; i++)
21 {
22         map<int,int>my;//用来离散化的(将大的数转化1000以内的数)
23         memset(dp,0,sizeof(dp));
24         for(j=0; j<=1000; j++)
25 {
26             dp[1][j]=1;
27         }//当就选1个时全初始化1
28         scanf("%d %d",&p,&q);
29         for(j=1; j<=p; j++)
30 {
31             scanf("%d",&a[j]);
32             b[j]=a[j];
33 }
34         sort(b+1,b+p+1);//离散化前的排序比如200 300 100 排完为100 200 300 那么对应为1 2 3 
35         int c[1005];
36         int cnt=1;
37         for(j=1; j<=p; j++)
38 {
39             if(j==1)
40 {
41                 my[b[j]]=cnt;
42 }
43             else
44 {
45                 if(b[j]!=b[j-1])
46 {
47                     cnt++;
48                     my[b[j]]=cnt;
49 }
50                 else
51 {
52                     my[b[j]]=cnt;
53 }
54 }
55 }
56         for(j=1; j<=p; j++)
57 {
58             a[j]=my[a[j]];
59         }//将原数组每个元素改为对应元素 200 100 300 -〉2 1 3
60         for(j=2; j<=q; j++)//要选的个数
61 {
62             memset(bit,0,sizeof(bit));
63             for(k=j-1; k<=p; k++)//可以改成从1循不过时间长
64 {
65                 ll nn=sum(a[k]-1);
66                 dp[j][k]=nn;
67                 add(a[k],dp[j-1][k],cnt);
68 }
69 }
70         ll endd=0;
71         for(j=1; j<=p; j++)
72 {
73             endd=(endd+dp[q][j])%pp;
74 }
75         printf("Case #%d: ",i);
76         printf("%lld
",endd);
77 }
78     return 0;
79 }
80 ll sum(intn)
81 {
82     ll s=0;
83     while(n>0)
84 {
85         s=(bit[n]+s)%pp;
86         n=n&(n-1);
87 }
88     returns;
89 }
90 void add(int n,ll kk,intz)
91 {
92     while(n<=z)
93 {
94         bit[n]=(kk+bit[n])%pp;
95         n+=(n&(-n));
96 }
97 }

免责声明:文章转载自《The 2015 China Collegiate Programming Contest -ccpc-c题-The Battle of Chibi(hdu5542)(树状数组,离散化)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇玩转FFmpeg的7个小技巧redis自定义RedisCacheManager下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

X86/X64处理器体系结构及寻址模式

由8086/8088、x86、Pentium发展到core系列短短40多年间,处理器的时钟频率差点儿已接近极限。尽管如此,自从86年Intel推出386至今除了添加一些有关流媒体的指令如mmx/sse之外。其它新增的大多数指令都能够从最初的指令集中组合实现相同的功能,整个编程模型维持了约有20多年。 1. 处理器体系结构 1.1. 处理器简要结构 我们都...

Tomcat下载安装及常见问题解决办法

一、Tomcat的下载: 下载地址:http://tomcat.apache.org/ 下载Tomcat6.0(在左侧的Download下,考虑到稳定性现在企业大部分还在用Tomcat6.0) (1)这两种直接解压就可以使用,一般下载这一种(解压到你想放的文件夹下,可以直接更改解压后的文件名,文件夹命名最好是英文。) 32-bit Windows zip...

Java: 将指定的某一bit位 置0、置1、取反

将指定的某一个比特位置0、置1、取反: /** * Set the specified bit to 1 * * @param originByte Raw byte value * @param bitIndex bit index (From 0~7) * @return Final byte va...

centos 64位系统如何使用XAMPP?

32位的机器随便装,几乎傻瓜式没什么说,不过64位的系统会被拒绝掉,并提示你无法启动,英文提醒”XAMPP is currently only availably as 32 bit application. Please use a 32 bit compatibility library for your system”难道不支持64位系统么? 当然不...

UART

UART(Universal Asynchronous Receiver/Transmitter,通用异步收/发器) s3c2440A 提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据,而且每个UART都分别有一个64个字节的接收FIFO和一个64个字节的发送FIFO。 OVERVIEW The UART can generate a...

java 读取图片色深

问题: 想写一个小程序可读取图片的色深(bit-depth)。网上有一些软件可完成这个功能,但是我想把程序做成一个可移植的插件。 本想用c写的,但实在麻烦,最后选择java,与很多方法不用自己写,速度快。 最后打包成一个jar包,只要装了jdk就可以在控制台运行。 我用的是MYECLIPSE,步骤如下:1.创建一个工程; 2.创建一个java class...