思路参考 这里

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int MAXN = ; struct node
{
int l, r;
int idx;
}; node Qry[MAXN]; //查询
int C[MAXN]; //树状数组
int vis[MAXN]; // i 的倍数上一次出现的位置
int num[MAXN]; //原数组
int ans[MAXN]; //答案
int N, Q; bool cmp( node a, node b )
{
return a.l > b.l;
} int lowbit( int x )
{
return x & (-x);
} int query( int x )
{
int res = ;
while ( x > )
{
res = max( res, C[x] );
x -= lowbit(x);
}
return res;
} void Add( int x, int val )
{
while ( x <= N )
{
C[x] = max( C[x], val );
x += lowbit(x);
}
return;
} int main()
{
int T;
scanf( "%d", &T );
while ( T-- )
{
scanf( "%d", &N );
for ( int i = ; i <= N; ++i )
scanf( "%d", &num[i] ); scanf( "%d", &Q );
for ( int i = ; i < Q; ++i )
{
scanf("%d%d", &Qry[i].l, &Qry[i].r );
Qry[i].idx = i;
} sort( Qry, Qry + Q, cmp );
memset( C, , sizeof(C) );
memset( vis, , sizeof(vis) ); int i = , j = N;
while ( i < Q )
{
while ( j > && j >= Qry[i].l )
{
for ( int k = ; k*k <= num[j]; ++k )
{
if ( num[j] % k == )
{
if ( vis[k] )
{
Add( vis[k], k );
}
vis[k] = j; int tmp = num[j] / k;
if ( tmp != k )
{
if ( vis[tmp] )
{
Add( vis[tmp], tmp );
}
vis[tmp] = j;
}
}
}
--j;
} ans[ Qry[i].idx ] = query( Qry[i].r );
++i;
} for ( int i = ; i < Q; ++i )
printf( "%d\n", ans[i] );
}
return ;
}

n个数,如果把n个数的约数全部写出来。查询[l,r]之间的gcd的最大值,就相当于找一个最大的数,使得这个数是[l,r]之间至少是两个的约数。

对于一个数n,在sqrt(n)内可以找出所有约数。

我的做法是对查询进行离线处理。

将每个查询按照 l 从大到小排序。

然后 i 从 n~0 ,表示从后面不断扫这些数。

对于数a[i],找到a[i]的所有约数,对于约数x,在x上一次出现的位置加入值x.

这样的查询的时候,只要查询前 r 个数的最大值就可以了。

HDU 4630 No Pain No Game 树状数组+离线查询的更多相关文章

  1. HDU 4630 No Pain No Game 树状数组+离线操作

    题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...

  2. HDU 4630 No Pain No Game(树状数组)

    题目链接 看的别人的题解,离线之后,按r排序,枚举1-n,利用pre[j],存上次j的倍数出现的位置,树状数组里统计的当前位置到最后的最大值,树状数组是求区间最值其实应该很麻烦的,但是此题用法只是求到 ...

  3. 4630 no pain no game 树状数组

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4630 题意:给你N个数,然后给你M个询问,每个询问包含一个l 一个r,问你lr 这个区间中任意两个数最 ...

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

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

  5. bzoj 2743 树状数组离线查询

    我们按照询问的右端点排序,然后对于每一个位置,记录同颜色 上一个出现的位置,每次将上上位置出现的+1,上次出现的-1,然后 用树状数组维护就好了 /************************** ...

  6. HDU 3333 树状数组离线查询

    题目大意: 询问区间内不同种类的数的数值之和 这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突 我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的 ...

  7. 【树状数组+离线查询】HDU 3333 Turing Tree

    https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/H [题意] 给定一个数组,查询任意区间内不同数字之和. (n<=30000 ...

  8. SPOJ DQUERY树状数组离线or主席树

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

  9. hdu 5869 区间不同GCD个数(树状数组)

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

随机推荐

  1. Python中数据的保存和读取

    在科学计算的过程中,往往需要保存一些数据,也经常需要把保存的这些数据加载到程序中,在 Matlab 中我们可以用 save 和 lood 函数很方便的实现.类似的在 Python 中,我们可以用 nu ...

  2. java 多个设备,锁定先后顺序

    场景图: 4台android设备需要被锁定顺序,下次的时候按顺序socket推送数据到这4台不同的内容.当有新的一台机器加入时,如上图的E,则插入到原位置为C的地方.具体代码如下: public st ...

  3. HDU 5446 Unknown Treasure Lucas+中国剩余定理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...

  4. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  5. 【BZOJ】【3238】【AHOI2013】diff(差异)

    题目链接:www.lydsy.com/JudgeOnline/problem.php?id=3238 后缀数组 这题题面给的暗示性就很强啊……一看就是要用后缀xx一家的算法,由于本蒻只会后缀数组所以就 ...

  6. C#UDP编程总结

    // 如果只使用一个EndPoint,维持一个引用. private static UdpClient udpClient; static void Main(string[] args) { if ...

  7. Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service

    准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...

  8. href=#与href=javascriptvoid(0)的区别

    #"包含了一个位置信息 默认的锚点是#top 也就是网页的上端 而javascript:void(0)  仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首 而 ...

  9. VMware workstation 的虚拟机中再安装workstation

    在VMware workstation 10中运行的虚拟机中再安装workstation软件时,启动时会出现不断重启的故障, 解决办法: 在宿主虚拟机的.vmx文件中添加一行 monitor_cont ...

  10. touch事件学习

    window.onload = function(){ var touch = { movetarget : false, touchStart : function (e) { console.lo ...