Problem Description

This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studying some of them, Bob thinks that GCD is so interesting. One day, he comes up with a new problem about GCD. Easy as it looks, Bob cannot figure it out himself. Now he turns to you for help, and here is the problem:

Given an array a of N positive integers a1,a2,⋯aN−1,aN; a subarray of a is defined as a continuous interval between a1 and aN. In other words, ai,ai+1,⋯,aj−1,aj is a subarray of a, for 1≤i≤j≤N. For a query in the form (L,R), tell the number of different GCDs contributed by all subarrays of the interval [L,R].

Input

There are several tests, process till the end of input.

For each test, the first line consists of two integers N and Q, denoting the length of the array and the number of queries, respectively. N positive integers are listed in the second line, followed by Q lines each containing two integers L,R for a query.

You can assume that

1≤N,Q≤100000

1≤ai≤1000000

Output

For each query, output the answer in one line.

Sample Input

5 3

1 3 4 6 9

3 5

2 5

1 5

Sample Output

6

6

6

**题意:**给你n个数Q个查询,每次查询询问[l,r]内不同gcd的个数
**思路:**Q很大,按照一般思路使用线段树在线操作似乎不可行,所以考虑使用离线操作。但重点在于如何预处理出GCD。
在这里我们固定右端点,枚举上一个端点所存的所有不同GCD值,求GCD,并记录不同的,延伸右端点时,再重复操作即可。
在树状数组更新时,当出现一个重复的GCD值,始终把标记维护到最靠右的,并把之前出现的相同GCD的位置所在的标记消掉。这样就能使数量数组拥有前缀特性,可以使用sum[r]-sum[l]了
容器套容器很好用阿,弱要加快学了。

/** @Date    : 2016-11-13-16.10

* @Author : Lweleth (SoungEarlf@gmail.com)

* @Link : https://github.com/

* @Version :

*/

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <algorithm>

#include <utility>

#include <vector>

#include <map>

#include <set>

#include <string>

#include <stack>

#include <queue>

#define pii pair<int , int>

#define FF first

#define SS second

#define MP(x,y) make_pair((x), (y))

#define LL long long

#define MMF(x) memset((x),0,sizeof(x))

#define MMI(x) memset((x), INF, sizeof(x))

using namespace std;



const int INF = 0x3f3f3f3f;

const int N = 1e5+2000;



int n,q;

int c[N];

int a[N];

int ans[N];

vector< pair<int,int> >gp[N];

int vis[1000010];



struct yuu

{

int l, r;

int m;

}Q[N];



int cmp(yuu a, yuu b)

{

return a.r < b.r;

}

int gcd(int a, int b)

{

return b?gcd(b, a % b):a;

}



void add(int x, int y)

{

while(x < N)

{

c[x] += y;

x += x & (-x);

}

}



int sum(int x)

{

int ans = 0;

while(x)

{

ans += c[x];

x -= x & (-x);

}

return ans;

}



void init()

{



MMF(c);

MMF(vis);

MMF(ans);

for(int i = 1; i <= n; i++)

{

int x = a[i];

int p = i;

for(int j = 0; j < gp[i-1].size(); j++)

{

int g = gcd(gp[i-1][j].FF, x);

if(x != g)

{

gp[i].push_back(MP(x, p));

x = g;

p = gp[i-1][j].SS;

}

}

gp[i].push_back(MP(x, p));

}

}

int main()

{

while(~scanf("%d%d", &n, &q))

{



MMF(a);

for(int i = 1; i <= n; i++ )

{

scanf("%d", a + i);

gp[i].clear();

}

init();

for(int i = 0; i < q; i++)

{

scanf("%d%d", &Q[i].l, &Q[i].r);

Q[i].m = i;

}



sort(Q, Q + q, cmp);

//////

int pos = 0;

for(int i = 1; i <= n; i++)

{

for(int j = 0; j < gp[i].size(); j++)//

{

if(vis[gp[i][j].FF])

add(vis[gp[i][j].FF], -1);

vis[gp[i][j].FF] = gp[i][j].SS;

add(gp[i][j].SS, 1);

}

while(Q[pos].r == i)

{

ans[Q[pos].m] = sum(Q[pos].r) - sum(Q[pos].l-1);

pos++;

}

}

for(int i = 0; i < q; i++)

printf("%d\n", ans[i]);



}

return 0;

}

HDU 5869 Different GCD Subarray Query 树状数组+离线的更多相关文章

  1. HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  2. HDU 5869 Different GCD Subarray Query rmq+离线+数状数组

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5869 Different GCD Subarray Query Time Limit: 6000/3 ...

  3. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  4. HDU 5869 Different GCD Subarray Query 离线+树状数组

    Different GCD Subarray Query Problem Description   This is a simple problem. The teacher gives Bob a ...

  5. HDU 5869 Different GCD Subarray Query(2016大连网络赛 B 树状数组+技巧)

    还是想不到,真的觉得难,思路太巧妙 题意:给你一串数和一些区间,对于每个区间求出区间内每段连续值的不同gcd个数(该区间任一点可做起点,此点及之后的点都可做终点) 首先我们可以知道每次添加一个值时gc ...

  6. HDU 5869 Different GCD Subarray Query

    离线操作,树状数组,$RMQ$. 这个题的本质和$HDU$ $3333$是一样的,$HDU$ $3333$要求计算区间内不同的数字有几个. 这题稍微变了一下,相当于原来扫描到$i$的之后是更新$a[i ...

  7. hdu 5869 Different GCD Subarray Query BIT+GCD 2016ICPC 大连网络赛

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  8. HDU 4630 No Pain No Game 树状数组+离线查询

    思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algo ...

  9. 【刷题】HDU 5869 Different GCD Subarray Query

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

随机推荐

  1. BZOJ 4361 isn 容斥+dp+树状数组

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...

  2. 转 Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405

    转自:http://www.cnblogs.com/SilenceTom/p/6697484.html 调用接口遇到Response for preflight has invalid HTTP st ...

  3. fuck the browser mode

    使用了source insight 4有一段时间了,今天用着突然发现我的鼠标移动到变量.函数.自定义的类型上时,单击鼠标左键直接就跳到了定义处,很像是按住了Ctrl再单击鼠标,用得极其不舒服,开始怀疑 ...

  4. fcntl函数详解

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数          fcntl -- file control头文件: #include <unistd.h> #include & ...

  5. 【Redis】- 总结精讲

    本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么这么快4.redis的数据类型,以及每种数据类型的使用场景5.redis的过期策略以及内存淘汰 ...

  6. DEDE去掉会员登录及注册验证码的方法

    1.登录打开member/index_do.php 删除245-250行,即: if(strtolower($vdcode)!=$svali || $svali=='') { ResetVdValue ...

  7. 载入其他同名源文件导致vs编译错误

    今天下午工程编译的时候总是通不过,提示1,某个类没有某个成员,可是我去该类的头文件下查看,确实包括了这个成员啊.2,没有某个类,可是我明明定义了的. 检查了好久才发现 原来是,我打开了其他工程下的某一 ...

  8. Maven面试宝典

    一.Maven有哪些优点和缺点 优点如下: 简化了项目依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于与持续集成工具(jen ...

  9. Delphi 模式窗体返回值ModalResult的使用方法及注意事项

    1.基础知识简介: ModalResult是指一个模式窗体(form.showmodal)的返回值,一般用于相应窗体上按钮的ModalResult属性: 显示完窗体(关闭)后,会返回此属性预设的值做为 ...

  10. SpringBoot2.0(五) CORS跨域

    部分跨域 @CrossOrigin注解支持类级别,方法级别添加.可以在controller类或者方法上添加,支持部分接口跨域.在两者上都添加时,方法级别的覆盖类级别的. 属性 说明 origins 允 ...