HDU5726 GCD(rmq+二分)
这道题是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+二分)相关推荐
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- 【HDU - 5875】Function(线段树,区间第一个小于某个数的数 或 RMQ二分)
题干: The shorter, the simpler. With this problem, you should be convinced of this truth. You a ...
- 2016 Multi-University Training Contest 1 GCD【RMQ+二分】
因为那时候没怎么补所以就分到了未搞分组里!!!然后因为标题如此之屌吧= =点击量很高,然后写的是无思路,23333,估计看题人真的是觉得博主就是个撒缺.废话不多说了,补题... update2016/ ...
- HDU5726(RMQ二分)
GCD Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status D ...
- poj 2452(RMQ+二分)
解题思路:这题实际上就是求某区间上的最值问题,可以先枚举区间的起始位置,然后二分去搜索比起始位置大的数且位置最远(这里可以用RMQ算法区间内的最小值),找到之后再利用RMQ算法找这段区间内的最大的,如 ...
- YbtOJ-相似子串【SA,RMQ,二分】
正题 题目大意 给出一个长度为nnn的字符串,两个串相似当且仅当可以通过每种字符置换使得它们相同. qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r子串有多少个相似的. 1≤ ...
- jzoj4817-square【区间RMQ,二分答案】
正题 题目链接:https://jzoj.net/senior/#contest/show/2956/2 题目大意 n∗mn*mn∗m的010101矩阵,每次询问(x1,y1,x2,y2)(x1,y1 ...
- Codeforces - tag::data structures 大合集 [占坑 25 / 0x3f3f3f3f]
371D 小盘子不断嵌套与大盘子,最后与地面相连,往里面灌水,溢出部分会往下面流,求每次操作时当前的盘子的容量 其实这道题是期末考前就做好了的.. 链式结构考虑并查集,然后没了(求大佬解释第一个T的点 ...
- 应该是最全的算法学习路线了吧法学习路线了吧
写在前面: 因为博主的技术有限,算法也是很难得一门科学,我只能给出尽量全的分类,然后尽可能的讲解. 但是有些算法超出了本人的能力范畴,说实在的就是我太菜了.所以大家就当本文是目录型的文章即可. 本人是 ...
最新文章
- train loss与test loss结果分析
- linux文本处理-grep
- 【无标题】RestHighLevelClient工具类
- JAVA 通过URL 获取页面内容
- Linux系统如何连接和上传文件到服务器上
- C++ Primer学习笔记(一)
- 移动互联消亡者及原因分析
- java中,数值计算时的类型转换 ( 两个int类型相加,赋值给double )
- 用MDT 2012为企业部署windows 7(四)--创建Deploymentshare共享以及介绍一些选项的具体作用...
- SPSS P小于0.05,结果真的有效吗?【SPSS 070期】
- 宝峰对讲机编码写频工具
- 《论语》全译——子路篇第十三
- Android 获取手机Ram 和 Rom大小
- 外显子名词解释_生物信息学常用名词解释(四)
- UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
- excel表格拆分多个表如何操作
- (Agora声网)多人视频聊天应用的开发(二)一对一聊天
- Qt程序获取管理员权限
- jeecgboot多表查询_jeecg-boot-multi-maven
- ios safari 中时间 Invalid Date及Nah问题
热门文章
- 一个webservice的初级例子
- 微软网站开始出现大量的关于Office 2007的相关下载
- jquery 开发总结(不断更新)
- struts1.2文件上传
- hadoop api 复制文件_Hadoop发布新组件:分布式对象存储系统Ozone
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
- 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
- 【Netty】主从反应器 ( Reactor ) 多线程模型
- 【C++ 语言】 C 与 C++ 兼容 ( extern C )
- 借助URLOS快速安装python3网站环境