这道题是2016第一场多校的1004,趁机优化了一发

题意:10W长度的数组,10W个询问,让你回答任意两点间的gcd和全局相同gcd的数量

思路:用由于gcd一段固定以后具有单调性的,用rmq nlogn预处理出所有gcd

然后用二分遍历枚举所有gcd的个数,存在mp里

然后对于每次询问,用nlogn的时间找到对应的gcd,在映射一下mp就可以了

/* ***********************************************
Author        :devil
Created Time  :2016/7/20 13:12:42
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int dp[N][20],mm[N],n,t,q;
map<int,LL>mp;
void initrmq()
{mm[0]=-1;for(int i=1; i<=n; i++)mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];for(int j=1; j<=mm[n]; j++)for(int i=1; i+(1<<j)-1<=n; i++)dp[i][j]=__gcd(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int rmq(int x,int y)
{int k=mm[y-x+1];return __gcd(dp[x][k],dp[y-(1<<k)+1][k]);
}
int main()
{//freopen("in.txt","r",stdin);scanf("%d",&t);for(int cas=1; cas<=t; cas++){scanf("%d",&n);for(int i=1; i<=n; i++)scanf("%d",&dp[i][0]);initrmq();mp.clear();for(int i=1; i<=n; i++){int l=i,r=n,mid,vs,tmp;while(1){tmp=l;vs=rmq(i,l);while(l<=r){mid=(l+r)>>1;if(rmq(i,mid)<vs) r=mid-1;else l=mid+1;}mp[vs]+=1ll*(r-tmp+1);r=n;if(l>r) break;}}int l,r;printf("Case #%d:\n",cas);scanf("%d",&q);while(q--){scanf("%d%d",&l,&r);int vs=rmq(l,r);printf("%d %lld\n",vs,mp[vs]);}}system("pause");return 0;
}

转载于:https://www.cnblogs.com/d-e-v-i-l/p/5687979.html

HDU5726 GCD(rmq+二分)相关推荐

  1. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

  2. 【HDU - 5875】Function(线段树,区间第一个小于某个数的数 或 RMQ二分)

    题干: The shorter, the simpler. With this problem, you should be convinced of this truth.        You a ...

  3. 2016 Multi-University Training Contest 1 GCD【RMQ+二分】

    因为那时候没怎么补所以就分到了未搞分组里!!!然后因为标题如此之屌吧= =点击量很高,然后写的是无思路,23333,估计看题人真的是觉得博主就是个撒缺.废话不多说了,补题... update2016/ ...

  4. HDU5726(RMQ二分)

    GCD Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status D ...

  5. poj 2452(RMQ+二分)

    解题思路:这题实际上就是求某区间上的最值问题,可以先枚举区间的起始位置,然后二分去搜索比起始位置大的数且位置最远(这里可以用RMQ算法区间内的最小值),找到之后再利用RMQ算法找这段区间内的最大的,如 ...

  6. YbtOJ-相似子串【SA,RMQ,二分】

    正题 题目大意 给出一个长度为nnn的字符串,两个串相似当且仅当可以通过每种字符置换使得它们相同. qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r​子串有多少个相似的. 1≤ ...

  7. jzoj4817-square【区间RMQ,二分答案】

    正题 题目链接:https://jzoj.net/senior/#contest/show/2956/2 题目大意 n∗mn*mn∗m的010101矩阵,每次询问(x1,y1,x2,y2)(x1,y1 ...

  8. Codeforces - tag::data structures 大合集 [占坑 25 / 0x3f3f3f3f]

    371D 小盘子不断嵌套与大盘子,最后与地面相连,往里面灌水,溢出部分会往下面流,求每次操作时当前的盘子的容量 其实这道题是期末考前就做好了的.. 链式结构考虑并查集,然后没了(求大佬解释第一个T的点 ...

  9. 应该是最全的算法学习路线了吧法学习路线了吧

    写在前面: 因为博主的技术有限,算法也是很难得一门科学,我只能给出尽量全的分类,然后尽可能的讲解. 但是有些算法超出了本人的能力范畴,说实在的就是我太菜了.所以大家就当本文是目录型的文章即可. 本人是 ...

最新文章

  1. train loss与test loss结果分析
  2. linux文本处理-grep
  3. 【无标题】RestHighLevelClient工具类
  4. JAVA 通过URL 获取页面内容
  5. Linux系统如何连接和上传文件到服务器上
  6. C++ Primer学习笔记(一)
  7. 移动互联消亡者及原因分析
  8. java中,数值计算时的类型转换 ( 两个int类型相加,赋值给double )
  9. 用MDT 2012为企业部署windows 7(四)--创建Deploymentshare共享以及介绍一些选项的具体作用...
  10. SPSS P小于0.05,结果真的有效吗?【SPSS 070期】
  11. 宝峰对讲机编码写频工具
  12. 《论语》全译——子路篇第十三
  13. Android 获取手机Ram 和 Rom大小
  14. 外显子名词解释_生物信息学常用名词解释(四)
  15. UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
  16. excel表格拆分多个表如何操作
  17. (Agora声网)多人视频聊天应用的开发(二)一对一聊天
  18. Qt程序获取管理员权限
  19. jeecgboot多表查询_jeecg-boot-multi-maven
  20. ios safari 中时间 Invalid Date及Nah问题

热门文章

  1. 一个webservice的初级例子
  2. 微软网站开始出现大量的关于Office 2007的相关下载
  3. jquery 开发总结(不断更新)
  4. struts1.2文件上传
  5. hadoop api 复制文件_Hadoop发布新组件:分布式对象存储系统Ozone
  6. Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
  7. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
  8. 【Netty】主从反应器 ( Reactor ) 多线程模型
  9. 【C++ 语言】 C 与 C++ 兼容 ( extern C )
  10. 借助URLOS快速安装python3网站环境