Problem 2236 第十四个目标

Accept: 4    Submit: 6
Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description


暮警官、妃英里、阿笠博士等人接连遭到不明身份之人的暗算,柯南追踪伤害阿笠博士的凶手,根据几起案件现场留下的线索发现凶手按照扑克牌的顺序行凶。在经
过一系列的推理后,柯南发现受害者的名字均包含扑克牌的数值,且扑克牌的大小是严格递增的,此外遇害者与毛利小五郎有关。

为了避免下一个遇害者的出现,柯南将可能遭到暗算的人中的数字按关联程度排列了出来,即顺序不可改变。柯南需要知道共有多少种可能结果,满足受害人名字出现的数字严格递增,但是他柯南要找出关键的证据所在,所以这个任务就交给你了。

(如果你看不懂上面在说什么,这题是求一个数列中严格递增子序列的个数。比如数列(1,3,2)的严格递增子序列有(1)、(3)、(2)、(1,3)、(1,2),共5个。长得一样的但是位置不同的算不同的子序列,比如数列(3,3)的答案是2。)

Input

多组数据(<=10),处理到EOF。

第一行输入正整数N(N≤100 000),表示共有N个人。

第二行共有N个整数Ai(1≤Ai≤10^9),表示第i个人名字中的数字。

Output

每组数据输出一个整数,表示所有可能的结果。由于结果可能较大,对1 000 000 007取模后输出。

Sample Input

3
1 3 2

Sample Output

5

Source

福州大学第十三届程序设计竞赛

思路:dp+树状数组优化+离散化;
状态转移方程:dp[i]=sum(dp[j]);a[j]<a[i];
dp[i]表示以a[i]结束呈严格递增的个数;因为每次都要到前面找比当前小的数,所以用树状数组优化下就行。
复杂度为n*(logn);
 1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<math.h>
7 using namespace std;
8 typedef long long LL;
9 const int N=1e9+7;
10 LL dp[100005];
11 LL bit[100005];
12 int ak[100005];
13 typedef struct pp
14 {
15 int x;
16 int id;
17 } ss;
18 ss ans[100005];
19 bool cmp(pp n, pp m)
20 {
21 return n.x<m.x;
22 }
23 void add(int i,int x,int n);
24 LL BIT(int i);
25 int main(void)
26 {
27 int i,j ,k;
28 int s;int n;
29 while(scanf("%d",&n)!=EOF)
30 {
31 int m;
32 for(i=1; i<=n; i++)
33 {
34 scanf("%d",&ans[i].x);
35 ans[i].id=i;
36 }
37 sort(ans+1,ans+1+n,cmp);
38 ak[ans[1].id]=1;
39 int cn=1;
40 int dd=ans[1].x;
41 for(i=2; i<=n; i++)
42 {
43 if(dd!=ans[i].x)
44 {
45 cn++;
46 dd=ans[i].x;
47 }
48 ak[ans[i].id]=cn;
49 }
50 memset(bit,0,sizeof(bit));
51 memset(dp,0,sizeof(dp));
52 for(i=1; i<=n; i++)
53 {
54 dp[i]=BIT(ak[i]-1);
55 dp[i]=(dp[i]+1)%N;
56 add(ak[i],dp[i],cn);
57 }
58 LL sum=0;
59 for(i=1; i<=n; i++)
60 {
61 sum=(sum+dp[i])%N;
62 }
63 printf("%lld\n",sum);
64 }
65 return 0;
66 }
67 LL BIT(int i)
68 {
69 LL s=0;
70 while(i>0)
71 {
72 s=(s+bit[i])%N;
73 i-=(i&(-i));
74 }
75 return s;
76 }
77 void add(int i,int x,int n)
78 {
79 while(i<=n)
80 {
81 bit[i]=(bit[i]+x)%N;
82 i+=(i&(-i));
83 }
84 }

Problem 2236 第十四个目标的更多相关文章

  1. FZu Problem 2236 第十四个目标 (线段树 + dp)

    题目链接: FZu  Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...

  2. 第十四个目标(dp + 树状数组 + 线段树)

    Problem 2236 第十四个目标 Accept: 17    Submit: 35 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  3. hdu6435 Problem J. CSGO标程讲解以及改正标程的一个错误(本来第一个样例过不了2333) 以及 poj2926 五维曼哈顿距离模板

    比赛的时候抄poj2926的模板,但改不来啊orz #include <iostream> #include <cstdio> #include <cstring> ...

  4. 第十四个目标 (fzu)

    http://acm.fzu.edu.cn/contest/problem.php?cid=151&sortid=8 Problem Description 目暮警官.妃英里.阿笠博士等人接连 ...

  5. FZU2236 第十四个目标 dp+树状数组优化

    分析:这种题烂大街,n^2,然后数据结构优化下到nlogn,离散化 #include <cstdio> #include <cstring> #include <queu ...

  6. 《挑战程序设计竞赛》2.4 数据结构-并查集 POJ1182 2236 1703 AOJ2170

    POJ1182 http://poj.org/problem?id=1182 题目 难得的中文题... 食物链 Time Limit: 1000MS Memory Limit: 10000K Tota ...

  7. [LeetCode] The Skyline Problem

    A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...

  8. hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)

    这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...

  9. ACM: A Simple Problem with Integers 解题报告-线段树

    A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & %l ...

随机推荐

  1. 学习java的第六天

    一.今日收获 1.开始了学习手册第二章的学习 2.了解了java里的常量与变量以及数据类型,与c语言的内容类似 二.今日难题 1.都是基础知识,没有什么难题 三.明日目标 1.继续学习java学习手册 ...

  2. 学习java的第二十七天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  3. 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释

    #1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...

  4. 双向循环链表模板类(C++)

    双向链表又称为双链表,使用双向链表的目的是为了解决在链表中访问直接前驱和后继的问题.其设置前驱后继指针的目的,就是为了节省其时间开销,也就是用空间换时间. 在双向链表的每个节点中应有两个链接指针作为它 ...

  5. Docker学习(五)——Docker仓库管理

    Docker仓库管理     仓库(Repository)是集中存放镜像的地方. 1.Docker Hub       目前Docker官方维护了一个公共仓库Docker Hub.大部分需求都可以通过 ...

  6. VIM中把^M替换为真正的换行符

    :%s/\r/\r/g 或者:%s/^M/\r/g 红色的^M不是直接打出,而是按住ctrl再依次按下V和M

  7. Linux学习 - 压缩解压命令

    一." .gz "压缩文件 1 压缩语法 gzip  [文件] 2 解压语法 gunzip  [压缩文件] 3 注 gzip只能压缩文件 gzip不保留原文件 二." . ...

  8. java中的原子操作类AtomicInteger及其实现原理

    /** * 一,AtomicInteger 是如何实现原子操作的呢? * * 我们先来看一下getAndIncrement的源代码: * public final int getAndIncremen ...

  9. 【Service】【Database】【MySQL】基础

    1. 概念 1.1. 作者:Unireg 1.2. MySQL AB --> MySQL Solaris:二进制版本: 1.3. 官方网站: MySQL: www.mysql.com Maria ...

  10. vue实现input输入框的模糊查询

     最近在用uni-app做一个项目,使用的框架还是vue,想了好久才做出来 . HTML代码部分 <input type="text" focus class="s ...