这道题主要就是问你,长度为n的序列,有多少种上升的子序列

当前点的情况种数等于前面所有小于它的点的种数相加 + 1

1就是只有这一个点的时候的序列

那就是要多次查询前面比它小的点的种数的和

那么就是区间求和

用到树状数组就过了

一开始我用的a[k]表示这个点的值等于k时有多少种情况,但是后来考虑到对

输入的值没有限制

有可能这个点的值等于 100000000

那我就要建这么大的数组 明显过不去

并且我们只要直到这个点前面的种数和就行

排序后查找就行了

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. const int maxn = 5e5+;
  8. long long b[maxn];
  9. long long a[maxn];
  10. long long val[maxn];
  11. long long n;
  12. long long mod = 1e9+;
  13. long long getsum(long long c[],long long i);
  14. long long lowbit(long long k);
  15. void add(long long c[],long long i,long long j);
  16. int main()
  17. {
  18. int t;
  19. scanf("%d",&t);
  20. for(int ll = ; ll <= t; ++ll)
  21. {
  22. long long m,x,y,z;
  23. scanf("%lld%lld%lld%lld%lld",&n,&m,&x,&y,&z);
  24. for (long long i = ; i < m; i++)
  25. scanf("%lld",&a[i]);
  26. for (int i = ; i < n; i++){
  27. b[i+] = val[i+] = a[i%m];
  28. a[i%m] = (x*a[i%m]+y*(i+))%z;
  29. }
  30. memset(a, ,sizeof(a));
  31. sort(b+,b+n+);
  32. long long sum = ;
  33. for(long long i=;i<=n;++i)
  34. {
  35. long long pos = lower_bound(b+,b+n+,val[i]) - b;
  36. long long ans = getsum(a, pos-) + ;
  37. sum += ans;
  38. sum %= mod;
  39. add(a,pos,ans);
  40. }
  41. printf("Case #%d: %lld\n",ll,sum);
  42. }
  43. }
  44. long long lowbit(long long k)
  45. {
  46. return k&(-k);
  47. }
  48. void add(long long c[],long long i,long long j)
  49. {
  50. while(i<=n)
  51. {
  52. c[i] += j;
  53. c[i] %= mod;
  54. i += lowbit(i);
  55. }
  56. }
  57. long long getsum(long long c[],long long i)
  58. {
  59. long long sum = ;
  60. while(i > )
  61. {
  62. sum += c[i];
  63. sum %= mod;
  64. i -= lowbit(i);
  65. }
  66. return sum;
  67. }

hdu 3030的更多相关文章

  1. HDU 3030 - Increasing Speed Limits

    Problem Description You were driving along a highway when you got caught by the road police for spee ...

  2. hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)

    Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  3. HDU题解索引

    HDU 1000 A + B Problem  I/O HDU 1001 Sum Problem  数学 HDU 1002 A + B Problem II  高精度加法 HDU 1003 Maxsu ...

  4. HDU 4126 Genghis Khan the Conqueror 最小生成树+树形dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4126 Genghis Khan the Conqueror Time Limit: 10000/50 ...

  5. 【hdu 2176】取(m堆)石子游戏

    Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  6. 【hdu 3389】Game

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  7. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  9. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

随机推荐

  1. 4. 深入 Python 流程控制

    除了前面介绍的 while 语句,Python 还从其它语言借鉴了一些流程控制功能,并有所改变. 4.1. if 语句 也许最有名的是 if 语句.例如: >>> x = int(i ...

  2. Jackson高并发情况下,产生阻塞

    情况:在高并发情况下,查看线程栈信息,有大量的线程BLOCKED. 从线程栈得知,线程栈中出现了阻塞,锁在了com.fasterxml.jackson.databind.ser.SerializerC ...

  3. TCHAR函数查询

    https://blog.csdn.net/is2120/article/details/27542927

  4. mybatis 插入数据并返回主键值

    <insert id="insert" parameterType="com.pojo.TSubject" useGeneratedKeys=" ...

  5. sql2005性能优化(在32位系统上突破2G内存使用量的方法) .

    转载自http://blog.csdn.net/soldierluo/article/details/6589743 服务器磁盘为(SAS)IBM组成RAID0+1,SQL2K5只识别4G内存,实际只 ...

  6. SQL 将一个表中的所有记录插入到一个临时表中

    insert into #tempTable select * from TempTable WHERE + 查询条件

  7. 码云-中国的github

    # 域名城 https://www.domain.cn/ # 码云 https://gitee.com

  8. LSTM长短期记忆神经网络模型简介

    LSTM网络也是一种时间递归神经网络,解决RNN的长期依赖关系. RNN模型在训练时会遇到梯度消失或者爆炸的问题,训练时计算和反向传播,梯度倾向于在每一时刻递增或递减,梯度发散到无穷大或者0..... ...

  9. 811. Subdomain Visit Count

    这题主要难在构建关联容器,方法很多,但是核心都是把原字符串一截一截减下来处理,先把前面用空格隔开的次数转化为整数,然后处理后面的多层子域. 方法一,查找标志字符,用标志字符把字符串分成几段 stati ...

  10. 682. Baseball Game

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...