hdu 5869 区间不同GCD个数(树状数组)
Different GCD Subarray Query
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 221 Accepted Submission(s): 58
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].
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
1 3 4 6 9
3 5
2 5
1 5
6
6
- /*
- hdu 5869 区间不同GCD个数(树状数组)
- problem:
- 给你一组数, 然后是q个查询. 问[l,r]中所有区间GCD的值总共有多少个(不同的)
- solve:
- 感觉很像线段树/树状数组. 因为有很多题都是枚举从小到大处理查询的r. 这样的话就只需要维护[1,i]的情况
- 最开始用的set记录生成的gcd然后递推, 超时了.
- 因为区间gcd是有单调性的. (i-1->1)和i区间gcd是递减的.
- 而且用RMQ可以O(1)的查询[i,j]gcd的值.如果枚举[1,i-1]感觉很麻烦.所以用二分跳过中间gcd值相同的部分,即查询与i的区间gcd值为x的
- 最左边端点.
- 因为要求不同的值, 这让我想到了用线段树求[l,r]中不同数的个数(忘了是哪道题了 zz)
- 就i而言,首先找出最靠近i的位置使gcd的值为x. 然后和以前的位置作比较. 尽可能的维护这个位置靠右.
- 假设:
- [3,i-1]的gcd为3,[2,i]的gcd为3. 那么在位置3上面加1.因为只要[l,i]包含这个点,那么就会有3这个值.
- hhh-2016-09-10 19:01:57
- */
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <stdio.h>
- #include <cstring>
- #include <vector>
- #include <math.h>
- #include <queue>
- #include <set>
- #include <map>
- #define ll long long
- using namespace std;
- const int maxn = 100100;
- int a[maxn];
- map<ll,int>mp;
- struct node
- {
- int l,r;
- int id;
- } p[maxn];
- bool tocmp(node a,node b)
- {
- if(a.r != b.r)
- return a.r < b.r;
- if(a.l != b.l)
- return a.l < b.l;
- }
- ll Gcd(ll a,ll b)
- {
- if(b==0) return a;
- else return Gcd(b,a%b);
- }
- int lowbit(int x)
- {
- return x&(-x);
- }
- ll out[maxn];
- ll siz[maxn];
- int n;
- void add(int x,ll val)
- {
- if(x <= 0)
- return ;
- while(x <= n)
- {
- siz[x] += val;
- x += lowbit(x);
- }
- }
- ll sum(int x)
- {
- if(x <=0)
- return 0;
- ll cnt = 0;
- while(x > 0)
- {
- cnt += siz[x];
- x -= lowbit(x);
- }
- return cnt;
- }
- int dp[maxn][40];
- int m[maxn];
- int RMQ(int x,int y)
- {
- int t = m[y-x+1];
- return Gcd(dp[x][t],dp[y-(1<<t)+1][t]);
- }
- void iniRMQ(int n,int c[])
- {
- m[0] = -1;
- for(int i = 1; i <= n; i++)
- {
- m[i] = ((i&(i-1)) == 0)? m[i-1]+1:m[i-1];
- dp[i][0] = c[i];
- }
- for(int j = 1; j <= m[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]);
- }
- }
- void init()
- {
- mp.clear();
- memset(siz,0,sizeof(siz));
- iniRMQ(n,a);
- }
- int main()
- {
- int qry;
- while(scanf("%d",&n) != EOF)
- {
- scanf("%d",&qry);
- for(int i = 1; i<=n; i++)
- {
- scanf("%d",&a[i]);
- }
- init();
- for(int i = 0; i < qry; i++)
- {
- scanf("%d",&p[i].l),scanf("%d",&p[i].r),p[i].id = i;
- }
- int ta = 0;
- sort(p, p+qry, tocmp);
- for(int i = 1; i <= n; i++)
- {
- int thea = a[i];
- int j = i;
- while(j >= 1)
- {
- int tmid = j;
- int l = 1,r = j;
- while(l <= r)
- {
- int mid = (l+r) >> 1;
- if(l == r && RMQ(mid,i) == thea)
- {
- tmid = mid;
- break;
- }
- if(RMQ(mid,i) == thea)
- r = mid-1,tmid = mid;
- else
- l = mid+1;
- }
- if(!mp[thea])
- add(j,1);
- else if(mp[thea] < j && mp[thea])
- {
- add(mp[thea],-1);
- add(j,1);
- }
- mp[thea] = j;
- j = tmid-1;
- if(j >= 1) thea = RMQ(j,i);
- }
- while(ta < qry && p[ta].r == i)
- {
- out[p[ta].id] = sum(p[ta].r) - sum(p[ta].l-1);
- ta++;
- }
- }
- for(int i = 0; i < qry; i++)
- printf("%I64d\n",out[i]);
- }
- return 0;
- }
hdu 5869 区间不同GCD个数(树状数组)的更多相关文章
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- hdu 6203 ping ping ping(LCA+树状数组)
hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...
- hdu 5877 Weak Pair dfs序+树状数组+离散化
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Prob ...
- FZU2224 An exciting GCD problem 区间gcd预处理+树状数组
分析:(别人写的) 对于所有(l, r)区间,固定右区间,所有(li, r)一共最多只会有log个不同的gcd值, 可以nlogn预处理出所有不同的gcd区间,这样区间是nlogn个,然后对于询问离线 ...
- hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场
题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...
- hdu 1116 敌兵布阵(树状数组区间求和)
题意: 给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j). 输入: 首行输入一个t,表示共有t组数据. 接下来每行首行输入一个整数n,表示共有n个数字. ...
- 2016 大连网赛---Different GCD Subarray Query(GCD离散+树状数组)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 Problem Description This is a simple probl ...
- HDU 4746 莫比乌斯反演+离线查询+树状数组
题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...
- POJ 3928 & hdu 2492 & Uva1428 PingPong 【树状数组】
Ping pong Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- 《Effective Objective-C 2.0》摘要
前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...
- Flask 学习 十 博客文章
提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...
- 【iOS】swift-通过JS获取webView的高度
let webHeightStr = webView.stringByEvaluatingJavaScriptFromString("document.body.scrollHeight& ...
- 2017 国庆湖南 Day6
期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...
- [笔试题目]使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍?
[笔试题目] 使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍? StringBuffer 底层是依赖了一个字符数组才能存储字符 ...
- api-gateway实践(04)新服务网关 - 新手入门
一.网关引擎环境 1.下载代码 2.搭建环境 3.打包部署 二.配置中心环境 1.下载代码 2.搭建环境 3.打包部署 三.创建业务实例 1.以租户身份登录配置中心,注册 group.version. ...
- SQL Server数据库优化的10多种方法
巧妙优化sql server数据库的几种方法,在实际操作中导致查询速度慢的原因有很多,其中最为常见有以下的几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小, ...
- leetcode算法:Distribute Candies
Given an integer array with even length, where different numbers in this array represent different k ...
- SSM登陆注册
package com.coingod.controller; import java.io.IOException;import java.io.PrintWriter;import java.ut ...
- Mysql官方文档翻译系列14.18--MySql备份与恢复
原文链接: (https://dev.mysql.com/doc/refman/5.7/en/innodb-backup-recovery.html) The key to safe database ...