HDU 5726 GCD (RMQ + 二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726
给你n个数,q个询问,每个询问问你有多少对l r的gcd(a[l] , ... , a[r]) 等于的gcd(a[l'] ,..., a[r'])。
先用RMQ预处理gcd,dp[i][j] 表示从i开始2^j个数的gcd。
然后用map存取某个gcd所对应的l r的数量。
我们可以在询问前进行预处理,先枚举i,以i为左端点的gcd(a[i],..., a[r])的种类数不会超过log2(n),gcd呈单调不增性。(因为gcd值每次变化,至少除以2)
所以所有的gcd的种类个数最多就nlog2(n)。
明白之后,我们可以枚举i为左端点固定,然后二分一下右端点,计算每种gcd的数量。
大概理解之后就可以敲了,然后就是细节问题。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <ctime>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define Fill(x, y) memset((x), (y), sizeof(x))
#define Rep(i, x, y) for(int i = x; i <= y; ++i)
#define Dow(i, x, y) for(int i = x; i >= y; --i)
typedef long long LL;
typedef pair <int, int> P;
typedef pair <LL, LL> PLL;
const LL mod = 1e9 + ;
const LL inf = 1e18;
const int N = 1e5 + ;
int GCD(int a, int b) {
return b ? GCD(b, a % b) : a;
} int dp[N][];
map <int , LL> mp; void ST(int n) {
for(int k = ; k < ; ++k) {
for(int i = ; i + ( << k) - <= n ; ++i) {
dp[i][k] = GCD(dp[i][k - ] , dp[i + ( << (k - ))][k - ]);
}
}
} int rmq(int l , int r) {
int k = log2(r - l + );
return GCD(dp[l][k] , dp[r - ( << k) + ][k]);
} int main()
{
int t , n , q , u , v;
scanf("%d" , &t);
for(int ca = ; ca <= t ; ++ca) {
scanf("%d" , &n);
for(int i = ; i <= n ; ++i)
scanf("%d" , &dp[i][]);
ST(n);
mp.clear();
for(int i = ; i <= n ; ++i) {
int l , r , temp = i , gcd = dp[i][] , s = i;
do {
l = temp , r = n;
s = l , gcd = rmq(i , s);
while(l <= r) {
int mid = (l + r) / ;
temp = mid;
if(rmq(i , mid) < gcd) {
r = mid - ;
temp = mid - ;
}
else {
l = mid + ;
}
}
mp[gcd] += (LL)(temp - s + );
temp++;
}while(temp <= n);
}
printf("Case #%d:\n" , ca);
scanf("%d" , &q);
while(q--) {
scanf("%d %d" , &u , &v);
int gcd = rmq(u , v);
printf("%d %lld\n" , gcd , mp[gcd]);
}
}
return ;
}
HDU 5726 GCD (RMQ + 二分)的更多相关文章
- hdu 5726 GCD 倍增+ 二分
题目链接 给n个数, 定义一个运算f[l,r] = gcd(al, al+1,....ar). 然后给你m个询问, 每次询问给出l, r. 求出f[l, r]的值以及有多少对l', r' 使得f[l, ...
- HDU 5726 GCD 区间GCD=k的个数
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- HDU 5726 GCD (2016多校、二分、ST表处理区间GCD、数学)
题目链接 题意 : 给出一个有 N 个数字的整数数列.给出 Q 个问询.每次问询给出一个区间.用 ( L.R ) 表示.要你统计这个整数数列所有的子区间中有多少个和 GCD( L ~ R ) 相等.输 ...
- hdu 3486 Interviewe (RMQ+二分)
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 5726 GCD(RMQ+二分)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5726 题意:给出一串数字,现在有多次询问,每次询问输出(l,r)范围内所有数的gcd值,并且输出有多 ...
- hdu 5726 GCD 暴力倍增rmq
GCD/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence ...
- HDU 5726 GCD(ST&RMQ)
题目链接 GCD 先ST倍增预处理,f[i][j]表示从i开始(包含第i个数)的连续2^j个数的最大公约数. 这样就可以在O(1)内询问得到a[l]到a[r]之间的所有数的最大公约数的值. 然后对于每 ...
- 2016 Multi-University Training Contest 1 GCD RMQ+二分(预处理)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 题意:有N(N <= 100,000),之后有Q(Q <= 100,000)个区间查询[ ...
- HDU 5726 GCD (2016 Multi-University Training Contest 1)
Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description Give y ...
随机推荐
- UVa 116 (多段图的最短路) Unidirectional TSP
题意: 有一个m行n列的正整数环形矩阵(即矩阵第一行的上一行是最后一行,最后一行的下一行是第一行),从第一列的任意位置出发,每次只能向右,右上,右下三个方向行走,输出路径及路径上所有数之和的最大值,多 ...
- BZOJ2299: [HAOI2011]向量
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2299 题解:乱搞就可以了... 不妨认为有用的只有(a,b)(a,-b)(b,a)(b,-a) ...
- 在win7系统下使用TortoiseGit(乌龟git)简单操作Git@OSC
非常感谢OSC提供了这么好的一个国内的免费的git托管平台.这里简单说下TortoiseGit操作的流程.很傻瓜了 首先你要准备两个软件,分别是msysgit和tortoisegit,乌龟还可以在下载 ...
- Android进度加载的Loading效果
网上看到的一个开源项目的loading效果,效果很赞,记录一下: 开源项目地址如下:https://github.com/RomainPiel/Titanic
- SVN版本管理提示信息
1. FAQ 1.路径或权限不足时将出现错误信息提示: http://192.134.4.251/svn/svnproject(路径不对)Error * PROPFIND request failed ...
- TCP/IP详解学习笔记(2)-数据链路层
数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RARP请 求和接收RARP应答 ip大家都听说过.至于ARP和RARP,ARP ...
- 分布式发布订阅消息系统 Kafka 架构设计
我们为什么要搭建该系统 Kafka是一个分布式.分区的.多副本的.多订阅者的“提交”日志系统. 我们构建这个系统是因为我们认为,一个实现完好的操作日志系统是一个最基本的基础设施,它可以替代一些系统来作 ...
- [持续更新]android stduio的一些小技巧
1.导入第三方jar 无法和eclipse一样可以直接刷新就可以导入libs里的jar,要到jar文件上右键按add jar. 2.其他依赖项目里有support-v4包的时候 在Libs里还是要有s ...
- Alibaba
题意: 有n个东西在一条路上,已知他们的位置,和能获得他们的最后期限,求能获得n个东西的最小总时间. 分析: 想到了求”未来费用问题", dp[i][j][k]表示获得区间长i起点为j的所有 ...
- res/raw和assets的 区别
res/raw和assets的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.ja ...