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


    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 ", ans[i]);

    }
    return 0;
    }
  • 相关阅读:
    Redis使用小结
    MongoDB中的变更通知
    发布一个从迅雷下载字幕的小工具
    在Windows下通过netsh命令实现端口映射
    .net core在Linux ARM板上运行
    通过WinAPI播放PCM声音
    spring中scope作用域(转)
    Spring <context:annotation-config/> 解说(转)
    Jenkins+Maven+SVN快速搭建持续集成环境(转)
    maven中跳过单元测试(转)
  • 原文地址:https://www.cnblogs.com/Yumesenya/p/6079602.html
Copyright © 2020-2023  润新知