题目大意:

由1开始不断往数组中添加数

就是按照当前所在位置所在的数表示的个数添加这个数目的数

1 2 2 3 3 后面因为要填4,而4号位置为3,说明之后要填3个4

问题就是给定一个n,找到n出现的最后位置p,再找p出现的最后位置即可

这里可以考虑先找到g[i]表示 i 连续出现了多少次

这里想一下的话,因为g[i] 相当于 i 位置出现的数

所以g[i]也满足这个序列

令f[i] 表示 i 出现的最后位置,也就是1~i的总个数

后面去计算g[i]的时候就可以考虑的是找到第 i 个位置在那个f[]的区间内  , 如果f[k-1]< i <= f[k]

那么说明此时 g[i] = k

那么就可以logn的复杂度计算g[n]了

要计算最后的答案,要考虑的是,给定的n,找到最后出现的p,中间长度 p = g[1]+g[2]....+g[p]

然后再找对应的ans ,那么每次增加的g[i],就会让整个序列 的长度增加 i*g[i]

i*g[i] 可以理解为的是,长度为i的数量有g[i]个, 所以总长度是i*g[i]

所以ans = sigma(i*g[i]) i<=n

那么对于n <= 1e9

那么大致计算一下会发现f[500000]>1e9

所以g[n]<500000只要暴力求出前500000的g[] , f[]

那么答案计算前,先找到g[n]是多少

g[n]= lower_bound(f+1 , f+N+1 , n)-f

然后说明[1 , g[n]-1]这一段区间内的所有长度都被用到了

所以之前预处理这个长度的前缀和 sum[]

对于每一个长度 i ,他出现的次数都是 f[i]-f[i-1]

sigma(n*g[n]) f[i-1]<n<=f[i]  -> g[n] = i

那么答案就是 i*等差数列了,记得取模(⊙o⊙)哦

然后(g[n]-1 , g[n]]这一段只要枚举 (g[n]-1 , n] 就可以了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 #include <queue>
 6 using namespace std;
 7 #define M 26
 8 #define N 500000
 9 #define ull unsigned long long
10 #define ll long long
11 const int MOD = 1000000007;
12 int f[N+2] , g[N+2] , cnt[N+2];
13 ll sum[N+2];
14
15 int Hash(int v)
16 {
17     return lower_bound(f+1 , f+N+1 , v)-f;
18 }
19
20 void init()
21 {
22     g[1] = 1 , f[1] = 1;
23     g[2] = 2 , f[2] = 3;
24     for(int i=3 ; i<=N ; i++){
25         g[i] = lower_bound(f+1 , f+i , i)-f;
26         f[i] = f[i-1]+g[i];
27     }
28 //    for(int i=1 ;i<=100 ; i++)
29 //        cout<<i<<" "<<g[i]<<" "<<f[i]<<endl;
30 //    cout<<f[N]<<endl;
31
32     sum[1] = 1;
33     for(int i=2 ; i<=N ; i++){
34         sum[i] = sum[i-1]+(ll)(f[i-1]+1+f[i])*(f[i]-f[i-1])/2 % MOD * (ll)i % MOD;
35       //  if(i<=10) cout<<"sum: "<<i<<" "<<sum[i]<<endl;
36     }
37 }
38 int main() {
39 //    freopen("a.in" , "r" , stdin);
40 //    freopen("out.txt" , "w" , stdout);
41
42     init();
43     int T , n;
44     scanf("%d" , &T);
45     while(T--){
46         scanf("%d" , &n);
47         int pos = Hash(n);
48         ll ret = sum[pos-1];
49         for(int i=f[pos-1]+1 ; i<=n ; i++) //这个区间每个长度都为pos
50         {
51             ret = (ret+(ll)i*pos)%MOD;
52         }
53         printf("%I64d\n" , ret);
54     }
55     return 0;
56 }

转载于:https://www.cnblogs.com/CSU3901130321/p/4805973.html

HDU 5439 Aggregated Counting相关推荐

  1. 后缀数组 --- HDU 3518 Boring counting

    Boring counting Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...

  2. 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)

    题干: Little A is an astronomy lover, and he has found that the sky was so beautiful! So he is countin ...

  3. HDU 1718 Rank counting sort解法

    本题是利用counting sort的思想去解题. 注意本题,好像利用直接排序,然后查找rank是会直接被判WA的.奇怪的推断系统. 由于分数值的范围是0到100,很小,而student 号码又很大, ...

  4. hdu 5439 Ponds(长春网络赛——拓扑排序+搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5438 Ponds Time Limit: 1500/1000 MS (Java/Others)     ...

  5. HDU 3664 Permutation Counting

    Permutation Counting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. HDU - 3518 Boring counting(后缀数组)

    题目链接:点击查看 题目大意:给出一个字符串,问有多少个子串出现了两次以上,计算时彼此不能覆盖 题目分析:因为数据范围比较小,我们可以直接暴力,枚举子串的长度,利用height数组的性质将后缀分为不同 ...

  7. HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)

    问题抽象:区间内恰好出现K次的数的个数. ------------------------------------------------------------------ UESTC出的题就是神啊 ...

  8. HDU 3664 Permutation Counting(DP)

    题目链接 弱爆啦,组合弱爆了,反正是没想出来怎么搞这个题,其实这个公式不难推啊,反正就是没推出来.今天队内赛,实在是没办法了,暴力写了个DFS,先把10以内的打出表来,发现类似杨辉三角的一个表,推不出 ...

  9. 2015 ACM/ICPC Asia Regional Changchun Online题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABEGHJL A. Alisha's Party AC的C++语言程序: #pragma warning(disa ...

最新文章

  1. Windows 2008 R2中的NAP新功能详解
  2. 设计模式-建造者模式(05)
  3. 微信扫码登陆/微信公交号 登录PHP 自适应 UnionID统一用户
  4. 廖雪峰 python_40岁老男人从0开始学python实录(第1天)
  5. Linux-Rsync命令参数详解
  6. 与Oracle配套组件,oracle 组件和体系结构
  7. html 常见hack,针对主流浏览器的CSS-HACK写法及IE常用条件注释
  8. C++Primer学习笔记:第4章 表达式
  9. Python介绍、发展史、安装、变量、注释、输入
  10. Python利用双端队列判断回文词
  11. 依赖项出现感叹号怎么办_「电脑常用技巧」不喜欢看到的黄色感叹号
  12. 增强 扫描王 源码_BlueScan:一款功能强大的蓝牙扫描器
  13. Python自动化运维之21、CSS
  14. 公众号获取用户手机号_微信公众号如何选取种子用户
  15. 使用ssh远程连接家庭电脑
  16. STM32控制启动步进电机
  17. Git HEAD detached from origin(冲突解决后无法正常push) 问题的解决方案
  18. 如何保存你的登录密码
  19. JS+CSS实现漂亮的日历特效(仿win10系统日历)
  20. mac +xcode 下WebDriverAgent环境配置

热门文章

  1. LeetCode 344 反转字符串
  2. java 隐藏了什么_JAVA程序中封装与隐藏是什么意思
  3. shmmax单位_kernel.shmmax ,kernel.shmmni 和kernel.shmall
  4. C 中命名空间的五大常见用法
  5. Python3有效括号问题
  6. js text 和 html,JS DOM innerText和textContent的区别
  7. oracle添加表的索引,oracle批量添加指定表前缀的索引SQL语句
  8. html网页设如何置访问密码,利用JS给单页html加上简单访问密码,需要密码才能访问!...
  9. 什么是中国1号信令?
  10. 飞畅科技-工业交换机电源故障初探