题目大意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 子段就是表示是要连续的a[]

思路:固定右端点,预处理出所有的gcd,每次都和i-1的gcd比较,然后不断放入gcd即可。

然后就是树状数组的更新,枚举右端点即可。然后我们知道,大区间不如小区间来的实惠,所以我们每次有重复gcd出现的时候,都要把大区间更换成小区间即可

下午脑子有点不清楚。。。2333看别人的博客蒙了好久

  1. //看看会不会爆int!数组会不会少了一维!
  2. //取物问题一定要小心先手胜利的条件
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. #define LL long long
  6. #define ALL(a) a.begin(), a.end()
  7. #define pb push_back
  8. #define mk make_pair
  9. #define fi first
  10. #define se second
  11. /*
  12. 先总体说一下思路:求出区间的gcd,再对右进行排序,再枚举右端即可
  13. */
  14. const int maxn = 1e5 + ;
  15. int tree[maxn], a[maxn], pre[maxn * ], ans[maxn];
  16. int n, q;
  17. vector<pair<int, int> >qq[maxn], v[maxn];
  18.  
  19. int lowbit(int x) {return x & -x;}
  20. int gcd(int a, int b){
  21. return b == ? a : gcd(b, a % b);
  22. }
  23.  
  24. void update(int x, int val){
  25. for (int i = x; i <= n; i += lowbit(i)){
  26. tree[i] += val;
  27. }
  28. }
  29.  
  30. int sum(int x){
  31. int ans = ;
  32. for (int i = x; i > ; i -= lowbit(i)) ans += tree[i];
  33. return ans;
  34. }
  35.  
  36. void solve(){
  37. memset(pre, , sizeof(pre));
  38. memset(tree, , sizeof(tree));
  39.  
  40. for (int i = ; i <= n; i++){
  41. int len = v[i].size();
  42. for (int j = ; j < len; j++){
  43. pair<int, int> g = v[i][j];
  44. if (pre[g.first]) update(pre[g.first], -);
  45. pre[g.first] = g.second;
  46. update(g.second, );
  47. }
  48. len = qq[i].size();
  49. for (int j = ; j < len; j++){
  50. pair<int, int> p = qq[i][j];
  51. ans[p.second] = sum(i) - sum(p.first - );
  52. }
  53. }
  54. for (int i = ; i <= q; i++){
  55. printf("%d\n", ans[i]);
  56. }
  57. }
  58.  
  59. int main(){
  60. while (scanf("%d%d", &n, &q) == ){
  61. for (int i = ; i <= n; i++){
  62. scanf("%d", a + i);
  63. v[i].clear();
  64. qq[i].clear();
  65. }
  66. for (int i = ; i <= n; i++){
  67. int len = v[i - ].size();
  68. int val = a[i], pos = i;
  69. for (int j = ; j < len; j++){
  70. pair<int, int> p = v[i - ][j];
  71. int g = gcd(p.first, val);
  72. if (g != val) {
  73. v[i].pb(mk(val, pos));///要优先知道那一个区间里面的gcd
  74. val = g;
  75. pos = p.second;
  76. }
  77. }
  78. v[i].pb(mk(val, pos));
  79. }
  80. /*
  81. for (int i = 1; i <= n; i++){
  82. int len = v[i].size();
  83. for (int j = 0; j < len; j++){
  84. printf("%d&%d ", v[i][j].first, v[i][j].second);
  85. }
  86. printf("\n");
  87. }
  88. */
  89. for (int i = ; i <= q; i++){
  90. int l, r; scanf("%d%d", &l, &r);
  91. qq[r].pb(mk(l, i));
  92. }
  93. solve();
  94. }
  95. return ;
  96. }

区间gcd问题 HDU 5869 离线+树状数组的更多相关文章

  1. HDU 5869 (离线+树状数组)

    Problem Different GCD Subarray Query 题目大意 给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量. 解题分析 由于固定一个数为右端 ...

  2. 区间的关系的计数 HDU 4638 离线+树状数组

    题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...

  3. HDU 4417 离线+树状数组

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

  4. HDU - 4777 离线树状数组

    离线树状数组搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...

  5. 利用id来进行树状数组,而不是离散化以后的val HDU 4417 离线+树状数组

    题目大意:给你一个长度为n的数组,问[L,R]之间<=val的个数 思路:就像标题说的那样就行了.树状数组不一定是离散化以后的区间,而可以是id //看看会不会爆int!数组会不会少了一维! / ...

  6. HDU 5249 离线树状数组求第k大+离散化

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

  7. HDU 5869 Different GCD Subarray Query rmq+离线+数状数组

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5869 Different GCD Subarray Query Time Limit: 6000/3 ...

  8. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  9. HDU 2852 KiKi's K-Number(离线+树状数组)

    题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. 【转载】将绿色版Tomcat服务添加到系统服务并设为开机运行

    转自: http://www.cnblogs.com/lan0725/archive/2009/11/04/1873859.html   运行cmd打开控制台,进入Tomat目录/bin文件夹,输入如 ...

  2. 观看网上的N多教程有感

    MD只想说一句,我擦. 长篇大论,有个叼毛用呀,显示你文采.... 糟粕真TMD多,直接简单的步骤多好,不要显示的你有多专业,其实就是一个二逼. 还有N多论坛,扯淡的人更多.

  3. VBS控制鼠标移动和点击(附源代码下载)

    森思:想用vbs来控制鼠标的移动和点击,虽然按键精灵可以做到,但做这么简单的事情不想启动那么大一个程序,所以自己用VC写了一个小程序,可以让VBS来控制鼠标移动和点击. 用法: 移动鼠标到桌面坐标20 ...

  4. 使用CSS灵活的盒子

    CSS3灵活的盒子,或flexbox,是一个布局模式提供页面上的元素的安排这样的元素表现可以预见当页面布局必须适应不同屏幕大小和不同的显示设备.对于许多应用程序,灵活的块盒模型提供了一个改进模型,它不 ...

  5. android 瀑布流效果(仿蘑菇街)

    我们还是来看一款示例:(蘑菇街)           看起来很像我们的gridview吧,不过又不像,因为item大小不固定的,看起来是不是别有一番风味,确实如此.就如我们的方角图形,斯通见惯后也就出 ...

  6. SCP测试服务器的上行/下行带宽

    SCP测试服务器的上行/下行带宽,这个咋弄呢?有时间再研究一下.

  7. The magic behind configure, make, make install

    原文:https://robots.thoughtbot.com/the-magic-behind-configure-make-make-install#where-do-these-scripts ...

  8. 转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户

    但凡是学过Oracle的同学,对DBCA(Database Configuration Assistant, DBCA)都不会陌生,有了这个工具,使得创建数据库成为可能.而DBCA本身有图形和静默两种 ...

  9. 转 shell中字分隔的妙用:变量IFS

    IFS 的全称是 Interal Field Separator  ,即"内部区域分隔符",它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space  c ...

  10. java实现类似qq的窗口对聊

    Swing实现界面,socket实现通信 package com.learn.talk; import java.awt.BorderLayout; import java.awt.Dimension ...