题目大意:

由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] 就可以了

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define M 26
#define N 500000
#define ull unsigned long long
#define ll long long
const int MOD = ;
int f[N+] , g[N+] , cnt[N+];
ll sum[N+]; int Hash(int v)
{
return lower_bound(f+ , f+N+ , v)-f;
} void init()
{
g[] = , f[] = ;
g[] = , f[] = ;
for(int i= ; i<=N ; i++){
g[i] = lower_bound(f+ , f+i , i)-f;
f[i] = f[i-]+g[i];
}
// for(int i=1 ;i<=100 ; i++)
// cout<<i<<" "<<g[i]<<" "<<f[i]<<endl;
// cout<<f[N]<<endl; sum[] = ;
for(int i= ; i<=N ; i++){
sum[i] = sum[i-]+(ll)(f[i-]++f[i])*(f[i]-f[i-])/ % MOD * (ll)i % MOD;
// if(i<=10) cout<<"sum: "<<i<<" "<<sum[i]<<endl;
}
}
int main() {
// freopen("a.in" , "r" , stdin);
// freopen("out.txt" , "w" , stdout); init();
int T , n;
scanf("%d" , &T);
while(T--){
scanf("%d" , &n);
int pos = Hash(n);
ll ret = sum[pos-];
for(int i=f[pos-]+ ; i<=n ; i++) //这个区间每个长度都为pos
{
ret = (ret+(ll)i*pos)%MOD;
}
printf("%I64d\n" , ret);
}
return ;
}

HDU 5439 Aggregated Counting的更多相关文章

  1. Hdu 5439 Aggregated Counting (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online 找规律)

    题目链接: Hdu 5439 Aggregated Counting 题目描述: 刚开始给一个1,序列a是由a[i]个i组成,最后1就变成了1,2,2,3,3,4,4,4,5,5,5.......,最 ...

  2. Aggregated Counting(找规律 + 预处理)

    Aggregated Counting 转 : https://blog.csdn.net/cq_phqg/article/details/48417111 题解: 可以令n=1+2+2+3+3+.. ...

  3. [HDOJ5439]Aggregated Counting(乱搞)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5439 题意:按规则构造一个数列a a(1)=1 a(2)=2 a(2)=2 -------> 写两个 ...

  4. HDU 4358 Boring counting(莫队+DFS序+离散化)

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

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

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

  6. HDU 3518 Boring counting

    题目:Boring counting 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3518 题意:给一个字符串,问有多少子串出现过两次以上,重叠不能算两次 ...

  7. HDU - 4358 Boring counting (dsu on tree)

    Boring counting: http://acm.hdu.edu.cn/showproblem.php?pid=4358 题意: 求一棵树上,每个节点的子节点中,同一颜色出现k次 的 个数. 思 ...

  8. hdu 4358 Boring counting dfs序+莫队+离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

  9. HDU 3887:Counting Offspring(DFS序+树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...

随机推荐

  1. vi编辑器简单应用(摘抄)

    摘抄于 vi编辑器的使用 (2) (3) 1 vi编辑器的基本使用 1.1 vi的启动 打开: $ vi example.c 只读打开 $ vi –R example.c 1.2 vi的工作模式 1. ...

  2. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  3. 自定义view获取宽高

    View在构造函数初始化并未布局处理,此时宽高均为0,待所有控件初始化完毕后,由上级容器对内部各控件进行布局,此时控件才会具有位置与大小属性,可以通过以下方法获取:1.在ondraw()函数中获取,2 ...

  4. phalcon: 视图集成(内嵌模板)

    当一个网站把不同的模板分割成:头部,中间区域,底部时,我们就需要在不同的[中间区域]页面引入相同的头部跟底部.引入有2种方法, 一种是:在controller中调用: $this->view-& ...

  5. vsphere vcenter 添加域管理员

    选择 vcenter server  管理权限

  6. OneProxy wiki上线了

    文档的敏捷开发方式,希望把文档做好. http://www.onexsoft.com/dokuwiki/doku.php?id=oneproxy

  7. 【bzoj1025】游戏

    [bzoj1025]游戏 题意 windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,--,N写一排在纸上.然后再在这一排下面写 ...

  8. js键盘操作事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. css -- 题目汇总

    1.描述下浮动和它的工作原理.模块浮动,使其脱离文档流,并且生成一个块级框.(所以父级撑不开就得到了很好的解释) 2.清除浮动的方法有那些,分别适用于什么情形.clear  ,  父级元素overfl ...

  10. C++格式化输入输出

    要实现格式化输入输出,程序需要包含 iostreams 标准标头 <iomanip> 以定义几个各自采用单个参数的操控器. 备注: 其中每个操控器都返回重载 basic_istream&l ...