hdu 5869 区间内不同的GCD数(离线+树状数组)
2016-09-13 15:04
260 查看
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=5869
题意:
给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量。
分析:
这个题的本质和HDU 3333是一样的,HDU 3333要求计算区间内不同的数字有几个。
这题稍微变了一下,相当于原来扫描到i的之后是更新a[i]的情况,现在是更新log级别个数的数字(因为以i为结尾的区间,最多只有log级别种不同的gcd)。
代码:
题意:
给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量。
分析:
这个题的本质和HDU 3333是一样的,HDU 3333要求计算区间内不同的数字有几个。
这题稍微变了一下,相当于原来扫描到i的之后是更新a[i]的情况,现在是更新log级别个数的数字(因为以i为结尾的区间,最多只有log级别种不同的gcd)。
代码:
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <string> #include <map> #include <cmath> #include <queue> #include <set> using namespace std; typedef long long ll; const int N = 1000000 + 9; int c , a , pre , last , ans , n, q; int gcd (int a, int b) { return b == 0 ? a : gcd (b, a % b); } int lowbit (int x) { return x & (-x); } void update (int x, int val) { for (int i = x; i <= n; i += lowbit (i) ) c[i] += val; } int getsum (int x) { int ans = 0; for (int i = x; i >= 1; i -= lowbit (i) ) ans += c[i]; return ans; } int query (int l, int r) { return getsum (r) - getsum (l - 1); } struct node { int l, id; }; vector<node>inv ; int main() { while (~scanf ("%d%d", &n, &q) ) { int l, r; for (int i = 1; i <= n; i++) scanf ("%d", &a[i]), inv[i].clear(); for (int i = 1; i <= q; i++) { scanf ("%d%d", &l, &r); inv[r].push_back ( (node) {l, i}); } memset (last, 0, sizeof (last) ); memset (c, 0, sizeof (c) ); for (int i = 1; i <= n; i++) { for (int j = i, x = a[j]; j > 0; j --, x = gcd (x, a[j]) ) { if (j > last[x]) { if (last[x] != 0) update (last[x], -1); update (j, 1); last[x] = j; } if (x == 1) break; } for (int j = 0; j < inv[i].size(); j++) ans[inv[i][j].id] = query (inv[i][j].l, i); } for (int i = 1; i <= q; i++) printf ("%d\n", ans[i]); } return 0; } /* Sample Input 5 3 1 3 4 6 9 3 5 2 5 1 5 Sample Output 6 6 6 */
相关文章推荐
- hdu 5869 (求区间不同gcd的个数)
- hdu 5869 求区间不同gcd数 离线+树状数组+rmq二分
- Hdu-5869 Different GCD Subarray Query(区间不同值离线算法)
- HDU 5869 Different GCD Subarray Query(计数区间不同GCD)
- HDU 5869 区间不同GCD的个数
- hdu 5869 区间不同GCD个数(树状数组)
- HDU - 5869 Different GCD Subarray Query GCD+离线+树状数组(区间不同gcd的个数)
- HDU 5869 求区间中不同连续序列的gcd的个数(树状数组)
- 离线记录+树状数组(hdu 5869 统计任意区间的不同gcd值)
- HDU 5869 Different GCD Subarray Query [区间gcd预处理+离线]【数据结构】
- HDU 5869区间CGD不同种类数---树状数组+map统计区间不同种类数(离线)
- [区间GCD预处理 树状数组 离线] HDU 5869 Different GCD Subarray Query
- hdu 4622 求区间不同子串数 后缀数组|后缀自动机|字符串hash
- hdu 5786 Interval 区间gcd求和
- hdu5869——Different GCD Subarray Query(思考+树状数组)
- hdu5869——Different GCD Subarray Query(思考+树状数组)
- HDU 5869 Different GCD Subarray Query (数学gcd+树状数组离线查询)
- hdu 5726(区间gcd)
- hdu 5726 GCD (线段树 + 区间预处理)
- hdu_5726_GCD(线段树维护区间+预处理)