ST表优化区间gcd
ST表的使用需要所求区间答案具有可重复性(询问时需要用到两个区间重叠来覆盖询问区间)
此题要求gcd为x的区间个数
可以用ST表处理出所有区间的\(gcd\) \(O(nlogn)\)
将区间的左端点\(l\)固定所有以 \(l\) 为左端点的区间\(gcd\)不超过\(log(n)\)个 及全部区间的\(gcd\)不超过\(nlogn\)种
证明:
以\(l\)为左端点\(r\)在向右扩的过程中此区间\((l,r)\)的\(gcd\)只会不变或减小(显然成立法)而每次减小必定是会少一个因子至少会除\(2\)所以最多也就\(log(n)\)个\(l\)的位置有\(n\)个所以所有区间就有\(nlogn\)种\(gcd\)
据此我们可以求出所有\(cnt[gcd_i]\)\((gcd\)为\(gcd_i\)的区间个数\()\)
当\(l\)固定时区间\(gcd\)的分布为一段一段的(\(gcd_1,gcd_2,gcd_3,...\))且具有二分性可以用二分找到\(gcd\)变化的位置从而求出\(gcd\)为\(gcd_i\)的区间个数累加到\(cnt[gcd_i]\)中
最后询问直接输出\(cnt[x]\)即可
CGCDSSQ
题面翻译
给出一个长度为\(n(1<=n<=10^{5})\) 的序列和\(q(1<=q<=3*10^{5})\) 个询问,每个询问输出一行,询问\(gcd(a_l,a_{l+1},...,a_r)=x\) 的\((i,j)\) 的对数.
感谢@凌幽 提供的翻译
题目描述
Given a sequence of integers $ a_{1},...,a_{n} $ and $ q $ queries $ x_{1},...,x_{q} $ on it. For each query $ x_{i} $ you have to count the number of pairs $ (l,r) $ such that $ 1<=l<=r<=n $ and $ gcd(a_{l},a_{l+1},...,a_{r})=x_{i} $ .
is a greatest common divisor of $ v_{1},v_{2},...,v_{n} $ , that is equal to a largest positive integer that divides all $ v_{i} $ .
输入格式
Given a sequence of integers $ a_{1},...,a_{n} $ and $ q $ queries $ x_{1},...,x_{q} $ on it. For each query $ x_{i} $ you have to count the number of pairs $ (l,r) $ such that $ 1<=l<=r<=n $ and $ gcd(a_{l},a_{l+1},...,a_{r})=x_{i} $ .
is a greatest common divisor of $ v_{1},v_{2},...,v_{n} $ , that is equal to a largest positive integer that divides all $ v_{i} $ .
输出格式
For each query print the result in a separate line.
样例 #1
样例输入 #1
3
2 6 3
5
1
2
3
4
6
样例输出 #1
1
2
2
0
1
样例 #2
样例输入 #2
7
10 20 3 15 1000 60 16
10
1
2
3
4
5
6
10
20
60
1000
样例输出 #2
14
0
2
2
2
0
2
2
1
1
std
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define il inline
#define re register
const int N = 1e5+9;
int n,m,f[N][25];
map<int,ll>cnt;
il int gcd(re int x,re int y)
{
while(y)
{
x%=y;
swap(x,y);
}
return x;
}
il init()
{
for(re int j = 1;j <= 23;j++)
for(re int i = 1;i+(1<<j)-1 <= n;i++)
f[i][j] = gcd(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
il int query(int l,int r)
{
re int k = log2(r-l+1);
return gcd(f[l][k],f[r-(1<<k)+1][k]);
}
int main()
{
scanf("%d",&n);
for(re int i = 1;i <= n;i++)scanf("%d",&f[i][0]);
init();
for(re int i = 1;i <= n;i++)
{
re int L = i;
while(L <= n)
{
re int st = query(i,L);
int l = L,r = n+1;
while(l < r)
{
int mid = (l+r)>>1;
if(query(i,mid) != st)r = mid;
else l = mid+1;
}
cnt[st] += l-L;
L = l;
}
}
scanf("%d",&m);
while(m--)
{
re int x;
scanf("%d",&x);
printf("%lld\n",cnt[x]);
}
return 0;
}
ST表优化区间gcd的更多相关文章
- POJ1821 单调队列//ST表 优化dp
http://poj.org/problem?id=1821 当我们在考虑内层循环j以及决策k的时候,我们可以把外层变量i看作定值,以此来优化dp状态转移方程. 题意 有n个工人准备铺m个连续的墙,每 ...
- LOJ2014 SCOI2016 萌萌哒 并查集、ST表优化连边
传送门 一个朴素的做法就是暴力连边并查集,可是这是\(O(n^2)\)的.发现每一次连边可以看成两个区间覆盖,这两个区间之间一一对应地连边.可线段树对应的两个节点的size可能不同,这会导致" ...
- st表求区间最大值
Input 第一行给出一个数字N,接下来N+1行,每行给出一个数字Ai,(0<=i<=N<=1E6)接来给出一个数字Q(Q<=7000),代表有Q个询问每组询问格式为a,b即询 ...
- ST表求区间最值
#include<bits/stdc++.h> #define ll long long #define lowbit(x) x&-x using namespace std; ; ...
- 数据结构进阶:ST表
简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname ...
- Codeforces 359D Pair of Numbers | 二分+ST表+gcd
题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...
- st表树状数组入门题单
预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...
- HDU 5875 Function(ST表+二分)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5875 [题目大意] 给出一个数列,同时给出多个询问,每个询问给出一个区间,要求算出区间从左边开始不 ...
- BZOJ3577:玩手机(最大流,二维ST表)
Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接 ...
- Maximum repetition substring(POJ - 3693)(sa(后缀数组)+st表)
The repetition number of a string is defined as the maximum number \(R\) such that the string can be ...
随机推荐
- yum install lrzsz
yum install lrzsz rz:从本地上传文件至服务器 sz filename:从服务器下载文件至本地
- Java Socket底层实现浅析
最近在学Java的socket编程,发现Java可以很简单的通过socketAPI实现网络通信,但是我一直有个疑问,Java的socket的底层是怎么实现的? 如果没记错的话Java的底层是C和C++ ...
- day35-IO流02
JavaOI流02 4.常用的类 4.1文件字节流输入流-FileInputStream InputStream抽象类是所有类字节输入流的超类 InputStream常用的子类: FileInputS ...
- web字体浮在图像中央
在做项目的过程中遇到了需要将图像作为背景,将字体显示在图像中央需求. 尝试了两种做法: 第一种方法为设置一个div设置属性为relative固定这个框的位置,将图片铺在div块里. 在div再设一个d ...
- Linux Netlink学习笔记
参考链接:https://www.systutorials.com/docs/linux/man/7-netlink/ 1. 监听Netlink消息类型示例 Netlink是用户程序与内核通信的soc ...
- Scrum五大会议要怎么开?
在Scrum框架中,我们对Scrum的五个会议一定都不陌生,但如何组织这五个会议,才能让Scrum团队真正积极.主动地参与进项目管理中呢?接下来我们会以一个Sprint为周期,详细介绍一下Sprint ...
- C++ 左值引用与一级指针
将**左值引用**用于**一级指针**时,有以下几种用法: ```c++ //方式一:引用一级指针,常规用法 int a = 5; int * pa = &a; int * &rpa ...
- 第六章:Django 综合篇 - 8:信号 signal
django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...
- 使用nginx代理nexus,不是/根路径
location /nexus/ { proxy_pass http://192.168.0.218:8081/; proxy_set_header Host $host:$server_port; ...
- prometheus设置使用密码nginx反向代理访问
注意: 1.设置访问密码的方式 2.ngixn反向代理的配置 # 安装 Apache工具包 apt install apache2-utils htpasswd -bc /etc/nginx/.pro ...