【题目链接】

点击打开链接

【算法】

先考虑50分的做法 :

f[i]表示以i结尾的本质不同的上升子序列的个数

则f[i] = sigma(f[j]) (j < i,a[j] < a[i]),注意如果a[j]不止一个,只需加上下标最大的即可,否则会重复计数

那么,100分的做法,其实就是用树状数组来优化这个东西,注意因为a[i]最大10^9,所以要离散化

【代码】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 1e5 + ;
  4. const int MOD = 1e9 + ;
  5.  
  6. int i,n,ans,len;
  7. int a[MAXN],num[MAXN],rk[MAXN],pre[MAXN],val[MAXN];
  8.  
  9. class BinaryIndexedTree
  10. {
  11. private :
  12. int c[MAXN];
  13. public :
  14. inline int lowbit(int x)
  15. {
  16. return x & (-x);
  17. }
  18. inline void modify(int pos,int val)
  19. {
  20. int i;
  21. for (i = pos; i <= n; i += lowbit(i)) c[i] = (c[i] + val) % MOD;
  22. }
  23. inline int query(int pos)
  24. {
  25. int i,ans = ;
  26. for (i = pos; i; i -= lowbit(i)) ans = (ans + c[i]) % MOD;
  27. return ans;
  28. }
  29. } BIT;
  30.  
  31. template <typename T> inline void read(T &x)
  32. {
  33. int f = ; x = ;
  34. char c = getchar();
  35. for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
  36. for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
  37. x *= f;
  38. }
  39. template <typename T> inline void write(T x)
  40. {
  41. if (x < )
  42. {
  43. putchar('-');
  44. x = -x;
  45. }
  46. if (x > ) write(x/);
  47. putchar(x%+'');
  48. }
  49. template <typename T> inline void writeln(T x)
  50. {
  51. write(x);
  52. puts("");
  53. }
  54.  
  55. int main()
  56. {
  57.  
  58. read(n);
  59. for (i = ; i <= n; i++)
  60. {
  61. read(a[i]);
  62. num[i] = a[i];
  63. }
  64. sort(num+,num+n+);
  65. len = unique(num+,num+n+) - num - ;
  66. for (i = ; i <= n; i++) rk[i] = lower_bound(num+,num+len+,a[i]) - num;
  67. for (i = ; i <= n; i++)
  68. {
  69. val[i] = BIT.query(rk[i] - ) + ;
  70. BIT.modify(rk[i],(val[i] - val[pre[rk[i]]] + MOD) % MOD);
  71. pre[rk[i]] = i;
  72. }
  73.  
  74. for (i = n; i >= ; i--)
  75. {
  76. if (pre[rk[i]])
  77. {
  78. ans = (ans + val[i] - ) % MOD;
  79. pre[rk[i]] = ;
  80. }
  81. }
  82.  
  83. writeln(ans);
  84.  
  85. return ;
  86. }

【TJOI 2014】 上升子序列的更多相关文章

  1. [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)

    [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap) 题面 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...

  2. [TJOI]2013 最长上升子序列

    这个题据说是Splay,或者说是平衡树的模板题,但是我还是不会做--唉-- \(\color{red}{Description}\) 给定一个序列,初始为空.现在我们将\(1\)到\(N\)的数字插入 ...

  3. 2014年第五届蓝桥杯C/C++程序设计本科B组决赛

    1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...

  4. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

  5. POJ1159——Palindrome(最长公共子序列+滚动数组)

    Palindrome DescriptionA palindrome is a symmetrical string, that is, a string read identically from ...

  6. 编程算法 - 最长上升子序列问题 代码(C)

    最长上升子序列问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有一个长为n的数列a. 请求出这个序列中最长上升子序列的长度. 最长上升子序 ...

  7. 编程算法 - 最长公共子序列(LCS) 代码(C)

    最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...

  8. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  9. 2014年CCNU-ACM暑期集训总结

    2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...

随机推荐

  1. Go变量定义学习

    package main import ( "fmt" ) //变量定义: //使用var关键字或:=定义变量 //可放在函数内,或直接放在包内 //使用var()集中定义 //函 ...

  2. 聊聊flink的log.file配置

    本文主要研究一下flink的log.file配置 log4j.properties flink-release-1.6.2/flink-dist/src/main/flink-bin/conf/log ...

  3. 海战(洛谷 P1331)

    题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...

  4. Codeforces914E. Palindromes in a Tree

    n<=100000的树,每个点上有个字母a-t之一,问有多少这样的链经过每个点:它的某一个排列的字母串起来是回文的. 就是有最多一个字母是奇数个啦..这样点分算一波即可..细节较多详见代码 #i ...

  5. hihoCoder #1014 : Trie树 [ Trie ]

    传送门 #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...

  6. POJ 1144 割点

    题意 :求割点的数量 #include<iostream> #include<stdio.h> #include<vector> #include<strin ...

  7. codevs——3064 求和

    3064 求和  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 青铜 Bronze 题解  查看运行结果     题目描述 Description 输入一个数x(x <= ...

  8. java基础 3 Object通用方法(1)

    Object通用方法(1) clone: 浅复制    被复制对象的所有变量都含有与原对象相同的值,而所有对其他对象的引用仍然指向原来的对象,换言之,浅复制仅仅复                   ...

  9. Extjs.panel.Panel赋值的问题

    初学extjs,很是不爽.也是只有初学者才犯的错误,发出来以免再犯. 先创建一个panel var panel1 = Ext.create('Ext.panel.Panel', { id: 'p1', ...

  10. 分布式 OLTP 数据库

    PingCAP招聘职位-拉勾网-最专业的互联网招聘平台 分布式 OLTP 数据库