HDU 5439 Aggregated Counting
题目大意:
由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相关推荐
- 后缀数组 --- HDU 3518 Boring counting
Boring counting Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...
- 【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 ...
- HDU 1718 Rank counting sort解法
本题是利用counting sort的思想去解题. 注意本题,好像利用直接排序,然后查找rank是会直接被判WA的.奇怪的推断系统. 由于分数值的范围是0到100,很小,而student 号码又很大, ...
- hdu 5439 Ponds(长春网络赛——拓扑排序+搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5438 Ponds Time Limit: 1500/1000 MS (Java/Others) ...
- HDU 3664 Permutation Counting
Permutation Counting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU - 3518 Boring counting(后缀数组)
题目链接:点击查看 题目大意:给出一个字符串,问有多少个子串出现了两次以上,计算时彼此不能覆盖 题目分析:因为数据范围比较小,我们可以直接暴力,枚举子串的长度,利用height数组的性质将后缀分为不同 ...
- HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)
问题抽象:区间内恰好出现K次的数的个数. ------------------------------------------------------------------ UESTC出的题就是神啊 ...
- HDU 3664 Permutation Counting(DP)
题目链接 弱爆啦,组合弱爆了,反正是没想出来怎么搞这个题,其实这个公式不难推啊,反正就是没推出来.今天队内赛,实在是没办法了,暴力写了个DFS,先把10以内的打出表来,发现类似杨辉三角的一个表,推不出 ...
- 2015 ACM/ICPC Asia Regional Changchun Online题解
以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABEGHJL A. Alisha's Party AC的C++语言程序: #pragma warning(disa ...
最新文章
- Windows 2008 R2中的NAP新功能详解
- 设计模式-建造者模式(05)
- 微信扫码登陆/微信公交号 登录PHP 自适应 UnionID统一用户
- 廖雪峰 python_40岁老男人从0开始学python实录(第1天)
- Linux-Rsync命令参数详解
- 与Oracle配套组件,oracle 组件和体系结构
- html 常见hack,针对主流浏览器的CSS-HACK写法及IE常用条件注释
- C++Primer学习笔记:第4章 表达式
- Python介绍、发展史、安装、变量、注释、输入
- Python利用双端队列判断回文词
- 依赖项出现感叹号怎么办_「电脑常用技巧」不喜欢看到的黄色感叹号
- 增强 扫描王 源码_BlueScan:一款功能强大的蓝牙扫描器
- Python自动化运维之21、CSS
- 公众号获取用户手机号_微信公众号如何选取种子用户
- 使用ssh远程连接家庭电脑
- STM32控制启动步进电机
- Git HEAD detached from origin(冲突解决后无法正常push) 问题的解决方案
- 如何保存你的登录密码
- JS+CSS实现漂亮的日历特效(仿win10系统日历)
- mac +xcode 下WebDriverAgent环境配置
热门文章
- LeetCode 344 反转字符串
- java 隐藏了什么_JAVA程序中封装与隐藏是什么意思
- shmmax单位_kernel.shmmax ,kernel.shmmni 和kernel.shmall
- C 中命名空间的五大常见用法
- Python3有效括号问题
- js text 和 html,JS DOM innerText和textContent的区别
- oracle添加表的索引,oracle批量添加指定表前缀的索引SQL语句
- html网页设如何置访问密码,利用JS给单页html加上简单访问密码,需要密码才能访问!...
- 什么是中国1号信令?
- 飞畅科技-工业交换机电源故障初探