OO’s Sequence

Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5288


Mean:

给定一个数列,让你求所有区间上满足Ai%Aj!=0(Ai!=Aj)的Ai的个数之和。

analyse:

对于Ai,如果我们知道最靠近Ai且能够整除Ai的数的下标l和r,那么Ai对答案的贡献就是(r-i)*(i-l)。剩下的就是怎样去求每个Ai的l和r了。

首先我们预处理出:对于每个i,能够被1~i整除的数,用链表存起来。

那么对于输入的数列Ai,我们就可以在O(1)的时间复杂度内知道他能够被哪些数整除,然后去找这些数在pos数组中映射的位置。

从左往右求出每个Ai的l,从右往左求出每个Ai的r,然后O(n)扫一遍统计答案。

Time complexity: O(N*sqrt(A))

Source code: 

  1. /*
  2. * this code is made by crazyacking
  3. * Verdict: Accepted
  4. * Submission Date: 2015-07-22-08.50
  5. * Time: 0MS
  6. * Memory: 137KB
  7. */
  8. #include <queue>
  9. #include <cstdio>
  10. #include <set>
  11. #include <string>
  12. #include <stack>
  13. #include <cmath>
  14. #include <climits>
  15. #include <map>
  16. #include <cstdlib>
  17. #include <iostream>
  18. #include <vector>
  19. #include <algorithm>
  20. #include <cstring>
  21. #define LL long long
  22. #define ULL unsigned long long
  23. using namespace std;
  24. const int MAXN = 10005, MAXX = 100005, mod = 1e9 + 7;
  25. vector<int> divi[MAXN];
  26. int a[MAXX], l[MAXX], r[MAXX], pos[MAXX], n;
  27.  
  28. void init()
  29. {
  30. for( int i = 1; i <= 10000; ++i )
  31. for( int j = 1; j <= i; ++j )
  32. if( !( i % j ) ) divi[i].push_back( j );
  33. }
  34.  
  35. int main()
  36. {
  37. ios_base::sync_with_stdio( false );
  38. cin.tie( 0 );
  39. init();
  40. while( cin >> n )
  41. {
  42. for( int i = 0; i < n; ++i ) cin >> a[i];
  43. memset( l, -1, sizeof l );
  44. memset( r, 0x3f, sizeof r );
  45. memset( pos, -1, sizeof pos );
  46. for( int i = 0; i < n; ++i )
  47. {
  48. int lef = -1;
  49. for( int j = 0; j < divi[a[i]].size(); ++j )
  50. lef = max( lef, pos[divi[a[i]][j]] );
  51. pos[a[i]] = i;
  52. l[i] = lef;
  53. }
  54. memset( pos, 0x3f, sizeof pos );
  55. for( int i = n - 1; i >= 0; --i )
  56. {
  57. int rig = 0x3f3f3f3f;
  58. for( int j = 0; j < divi[a[i]].size(); ++j )
  59. rig = min( rig, pos[divi[a[i]][j]] );
  60. pos[a[i]] = i;
  61. r[i] = rig;
  62. }
  63. int ans = 0, L, R;
  64. for( int i = 0; i < n; ++i )
  65. {
  66. if( l[i] == -1 ) L = i + 1;
  67. else L = i - l[i];
  68. if( r[i] == 0x3f3f3f3f ) R = n - i;
  69. else R = r[i] - i;
  70. ans = ( L * R % mod + ans ) % mod;
  71. }
  72. cout << ans << endl;
  73. }
  74. return 0;
  75. }
  76. /*
  77.  
  78. */

  

2015 Multi-University Training Contest 1 - 1001 OO’s Sequence的更多相关文章

  1. 2015 Multi-University Training Contest 6 hdu 5357 Easy Sequence

    Easy Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. 2015 Multi-University Training Contest 2 hdu 5306 Gorgeous Sequence

    Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  3. HDU 6362.oval-and-rectangle-数学期望、微积分 (2018 Multi-University Training Contest 6 1001)

    2018 Multi-University Training Contest 6 6362.oval-and-rectangle 题意就是椭圆里画内接矩形,问你矩形周长的期望. 比赛的时候推了公式,但 ...

  4. HDU 6319.Problem A. Ascending Rating-经典滑窗问题求最大值以及COUNT-单调队列 (2018 Multi-University Training Contest 3 1001)

    2018 Multi-University Training Contest 3 6319.Problem A. Ascending Rating 题意就是给你长度为k的数列,如果数列长度k<n ...

  5. HDU 6298.Maximum Multiple-数学思维题(脑子是个好东西,可惜我没有) (2018 Multi-University Training Contest 1 1001)

    暑假杭电多校第一场,这一场是贪心场,很多贪心的题目,但是自己太菜,姿势挫死了,把自己都写吐了... 2018 Multi-University Training Contest 1 HDU6298.M ...

  6. 2015 Multi-University Training Contest 3 1001 Magician

    Magician Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5316 Mean: n个数,2种操作,1是单点更新,2是询问区间 ...

  7. 2015 Multi-University Training Contest 4 1001 Olympiad

    代码: #include<cstdio> #include<cstring> #include<set> using namespace std; int vis[ ...

  8. 2019 Multi-University Training Contest 1 - 1001 - Blank - dp

    http://acm.hdu.edu.cn/showproblem.php?pid=6578 不会做,看题解. 设dp[i][j][k][l]表示4种颜色出现的最后的位置分别是i,j,k,l的方法数, ...

  9. 【思路题】【多校第一场】【1001.OO’s Sequence】

    题目大意: 给你一个序列A,f(l,r) 表示 在[l,r]中 的Ai 对于每一个数Aj 都有 Ai%Aj!=0  的数目(  i!=j  ) 卡了一段时间..... 题解 简单题 定义两个数组L[i ...

随机推荐

  1. HiveServer2 的jdbc方式创建udf的修改(add jar 最好不要使用),否则会造成异常: java.sql.SQLException: Error while processing statement: null

    自从Hive0.13.0开始,使用HiveServer2 的jdbc方式创建udf的临时函数的方法由: ADD JAR ${HiveUDFJarPath} create TEMPORARY funct ...

  2. Android--Sensor传感器

    前言 Android提供了对设备传感器的支持,只要Android设备的硬件提供了这些传感器,Android应用可以通过传感器来获取设备的外界条件,包括手机的运行状态.当前摆放的方向等.Android系 ...

  3. Metaweblog在Android上使用

    同步发表于http://avenwu.net/2015/02/04/metaweblog metaweblog是一个博客接口协议,目前主流的博客平台均支持该协议,比如博客园,CSDN,WordPres ...

  4. 让MyEclipse2013兼容Retina屏幕

    1. 找到文件:/Applications/MyEclipse/MyEclipse Professional.app/Contents/Profile/myeclipse.app/Contents/I ...

  5. glide 加载圆角图片

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABEIAAAD3CAIAAACW6Gb7AAAgAElEQVR4nOy9e1QbZf74//zO4XvOYz

  6. Java WebService 简单实例[转]

    http://www.cnblogs.com/yisheng163/p/4524808.html?utm_source=tuicool 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必 ...

  7. DVI-A、DVI-D、DVI-I接口定义、DVI接口图和DVI接口标准介绍

    http://blog.csdn.net/cd520yy/article/details/16993179

  8. iOS开发-NSDate使用

    时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)至当前时间的总秒数.它也被称为 Unix 时间戳(Unix Timestamp). 下面是iOS中时间戳 与 时间之间的转换方法: ...

  9. python 字符串比较

    cmp方法比较两个对象,并根据结果返回一个整数.cmp(x,y)如果X< Y,返回值是负数 如果X>Y 返回的值为正数. sStr1 = 'strch'sStr2 = 'strchr'pr ...

  10. java计算当前周开始日期&结束日期

    public static Date getFirstDayOfWeek(Date date) { Calendar c = new GregorianCalendar(); c.setFirstDa ...