先用st表处理出所有l-r的GCD值,然后二分求得这些值一共出现了多少次。

  1 #include<bits/stdc++.h>
  2
  3 #define inf 0x3f3f3f3f
  4
  5 const int maxn=100000;
  6
  7 using namespace std;
  8
  9 typedef pair<int,int> P;
 10
 11 int l,r;
 12
 13 int icase;
 14
 15 int t,n,q;
 16
 17 int a[maxn+1];
 18
 19 int dp[maxn+1][20];
 20
 21 map<int,long long> m;
 22
 23 int gcd(int a,int b){
 24    return b==0?a:gcd(b,a%b);
 25 }
 26
 27 void RMQ(){
 28    for(int i=1;i<=n;i++){
 29         dp[i][0]=a[i];
 30    }
 31    for(int j=1;j<20;j++){
 32         for(int i=1;i<=n;i++){
 33                 if(i+((1<<(j-1))-1)<=n)
 34                 dp[i][j]=gcd(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
 35                 //printf("%d\n",dp[i][j]);
 36         }
 37    }
 38 }
 39
 40 int query(int l,int r){
 41     int k=(int)log2(double(r-l+1));
 42     return gcd(dp[l][k],dp[r-(1<<k)+1][k]);
 43 }
 44
 45 void Cal(){
 46    for(int i=1;i<=n;i++){
 47         int GCD=a[i],tail=i;
 48         while(tail<=n){
 49              int lb=tail,ub=n,mid=(lb+ub)>>1;
 50              while(ub-lb>1){
 51                 mid=(lb+ub)>>1;
 52                 if(query(i,mid)==GCD) lb=mid;
 53                 else ub=mid;
 54              }
 55              if(query(i,ub)==GCD){
 56                 m[GCD]+=(ub-tail+1);
 57                 tail=ub+1;
 58                 GCD=query(i,tail);
 59              } else if(query(i,mid)==GCD){
 60                 m[GCD]+=(mid-tail+1);
 61                 tail=mid+1;
 62                 GCD=query(i,tail);
 63              }
 64                else{
 65                 m[GCD]+=(lb-tail+1);
 66                 tail=lb+1;
 67                 GCD=query(i,tail);
 68              }
 69         }
 70    }
 71 }
 72
 73 void solve(){
 74   scanf("%d",&n);
 75   for(int i=1;i<=n;i++){
 76         scanf("%d",&a[i]);
 77   }
 78   RMQ();
 79   Cal();
 80   scanf("%d",&q);
 81   printf("Case #%d:\n",++icase);
 82   while(q--){
 83         scanf("%d%d",&l,&r);
 84         int res=query(l,r);
 85         printf("%d %I64d\n",res,m[res]);
 86   }
 87 }
 88
 89 void init(){
 90   m.clear();
 91   memset(dp,0,sizeof(dp));
 92 }
 93
 94 int main()
 95 {
 96     scanf("%d",&t);
 97     while(t--){
 98         init();
 99         solve();
100     }
101     return 0;
102 }

转载于:https://www.cnblogs.com/GeniusYang/p/5769572.html

hdu5726-GCD-ST表+二分相关推荐

  1. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  2. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

  3. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  4. luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...

    仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...

  5. HDU5726 GCD(rmq+二分)

    这道题是2016第一场多校的1004,趁机优化了一发 题意:10W长度的数组,10W个询问,让你回答任意两点间的gcd和全局相同gcd的数量 思路:用由于gcd一段固定以后具有单调性的,用rmq nl ...

  6. CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数组 aaa,下标从 000 开始,每次操作分为两个步骤: 构建出数组 bbb,有 bi=gcd(ai,a(i+1)modn)b_i=gcd(a ...

  7. 2016 Multi-University Training Contest 1 1004 GCD(ST表+二分)

    GCD 注意观察gcd⁡(al,al+1,...,ar)\gcd(a_{l},a_{l+1},...,a_{r})gcd(al​,al+1​,...,ar​),当lll固定不动的时候,r=l...nr ...

  8. P3564 [POI2014]BAR-Salad Bar(ST表 + 二分)

    P3564 [POI2014]BAR-Salad Bar 给定一个长度为nnn的数组,里面元素只有111跟−1-1−1,问选出一个长度为lenlenlen的区间使得,这个区间的前缀和时刻大于零,后缀和 ...

  9. Codeforces 359D Pair of Numbers | 二分+ST表+gcd

    题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...

  10. B. Integers Have Friends(cf)二分 + st表

    原题链接:Problem - 1548B - Codeforces 解决RMQ(区间最值)问题的算法. 总结的来说求rmq问题有多种方法:线段树,ST表等 线段树预处理O(nlogn),查询O(log ...

最新文章

  1. JS数组去重之利用set数据结构去重
  2. svnserve.conf: Option expected的问题解决方法
  3. python如何改变数据类型_如何改变numpy数组的数据类型和形状?
  4. nginx子目录301重定向到其他域名URL
  5. 类加载器ClassLoader
  6. ROS kinetic + Ubuntu16.04编译LSD-SLAM
  7. 谷粒商城:02. 数据库初始化以及SQL语句
  8. 列举计算机组装所需的各个硬件,计算机组装和维修期中考试.doc
  9. 计算机组成原理(白中英) 第一章课后题部分答案(知识点汇总及扩展)
  10. 计算机二级excel高级筛选,Excel高级筛选怎么用之相关案例:excel高级筛选多个条件(并且、或用法)...
  11. ET代理_切换ip软件网络功能。
  12. 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第2课2.3节概述
  13. uni-app新闻小程序
  14. 又有2名博士入选华为“天才少年”!学霸日常科研计划表曝光
  15. 机器学习中特征选择概述
  16. 数据库工程师考点2023
  17. 2022年嵌入式开发就业前景怎么样?
  18. 配置微型计算机实验报告,微型计算机原理实验报告.docx
  19. Fiddler使用 抓取手机数据包及中文乱码解决方案
  20. 快手客户端开发面试(一二三+HR面)

热门文章

  1. Java面试宝典————基础篇
  2. 优秀ppt作品范例_首次公开|锐普的内部PPT配色库
  3. python内存管理机制_python内存管理机制
  4. sata接口 图解 定义_SATA协议简介
  5. 温度 数值模拟 matlab,西安交通大学——温度场数值模拟(matlab)
  6. php class使用方法,PHP调试类Krumo使用教程
  7. r语言怎么保存代码_R代码忘记保存,系统崩溃了怎么办?
  8. HTML+CSS+JS实现 ❤️h5酷炫的天体木星动画特效❤️
  9. 《零基础》MySQL 安装(二)
  10. javascript 唯一值的集合 Set对象