The 2015 China Collegiate Programming Contest -ccpc-c题-The Battle of Chibi(hdu5542)(树状数组,离散化)
当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化(貌似好像现在也不懂)。百度百科——离散化,把无限空间中无限的个体映射到有限的空间中去,以此提高算法的时空效率。
这道题是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(int i)
3 {
4 int s=0;
5 while(i>0)
6 {
7 s+=bit[i];
8 i-=i&-i;
9 }
10 return s;
11 }
12
13
14 void add(int i,int x)
15 {
16 while(i<=n)
17 {
18 bit[i]+=x;
19 i+=i&-i;
20 }
21 }
为什么要离散化呢,因为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 long ll;
8 ll sum(int n);
9 void add(int n,ll kk,int z);
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 namespace std;
16 int main(void)
17 {
18 int n,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\n",endd);
77 }
78 return 0;
79 }
80 ll sum(int n)
81 {
82 ll s=0;
83 while(n>0)
84 {
85 s=(bit[n]+s)%pp;
86 n=n&(n-1);
87 }
88 return s;
89 }
90 void add(int n,ll kk,int z)
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)(树状数组,离散化)的更多相关文章
- The 2015 China Collegiate Programming Contest A. Secrete Master Plan hdu5540
Secrete Master Plan Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Othe ...
- The 2015 China Collegiate Programming Contest Game Rooms
Game Rooms Time Limit: 4000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- The 2015 China Collegiate Programming Contest C. The Battle of Chibi hdu 5542
The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Othe ...
- 2015南阳CCPC C - The Battle of Chibi DP树状数组优化
C - The Battle of Chibi Description Cao Cao made up a big army and was going to invade the whole Sou ...
- The 2015 China Collegiate Programming Contest L. Huatuo's Medicine hdu 5551
Huatuo's Medicine Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- The 2015 China Collegiate Programming Contest K Game Rooms hdu 5550
Game Rooms Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- The 2015 China Collegiate Programming Contest H. Sudoku hdu 5547
Sudoku Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- The 2015 China Collegiate Programming Contest G. Ancient Go hdu 5546
Ancient Go Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- The 2015 China Collegiate Programming Contest E. Ba Gua Zhen hdu 5544
Ba Gua Zhen Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- The 2015 China Collegiate Programming Contest D.Pick The Sticks hdu 5543
Pick The Sticks Time Limit: 15000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
随机推荐
- SQL-用到的数据库语句总结
0.SELECT * FROM CHARACTER_SETS LIMIT 0,10 #从CHARACTER_SETS表中,从第1行开始,提取10行[包含第1行] 1.SELECT * FROM ...
- typedef 的用法
[2]typedef (1)在C语言中,允许使用关键字typedef定义新的数据类型 其语法如下: typedef <已有数据类型> <新数据类型>; 如: typedef i ...
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- SQLite is 35% Faster Than The Filesystem
比方说你要在C++/PHP里实现一个函数Image get_image(string id),不同的图片有1万张(用户头像),你可以把它们存在一个目录/文件夹里,然后fopen()再fread. 你也 ...
- 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(五)-文件管理初步介绍
其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...
- 【Java 调优】Java性能优化
Java性能优化的50个细节(珍藏版) 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: ...
- springmvc框架找那个@responseBody注解
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html& ...
- 4.Vue.js-起步
Vue.js 起步 每个 Vue 应用都需要通过实例化 Vue 来实现. 语法格式如下: var vm = new Vue({ // 选项 }) 接下来让我们通过实例来看下 Vue 构造器中需要哪些内 ...
- ctypes与numpy.ctypeslib的使用
numpy ctypeslib 与 ctypes接口使用说明 作者:elfin 目录 一.numpy.ctypeslib使用说明 1.1 准备好一个C++计算文件 1.2 ctypeslib主要的五个 ...
- 30个类手写Spring核心原理之依赖注入功能(3)
本文节选自<Spring 5核心原理> 在之前的源码分析中我们已经了解到,依赖注入(DI)的入口是getBean()方法,前面的IoC手写部分基本流程已通.先在GPApplicationC ...