思路参考 这里

 #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. adb出现unkown host advices 错误

    今日在Windows DOS窗口中输入adb命令,如adb devices,adb shell等后,会出现如下错误: adb server is out of date.  killing... AD ...

  2. Gulp压缩JavaScript代码

    因为gulp是自动化工具,所以我们得告诉它,需要怎么做,才能达到我们的目的. 我们首先得新建一个js文件,用来编写我们的需求,以便gulp能按着我们的意愿来执行. 我将这个js文件取名叫gulpfil ...

  3. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 模拟

    题目链接: http://codeforces.com/contest/670/problem/E 题解: 用STL的list和stack模拟的,没想到跑的还挺快. 代码: #include<i ...

  4. JS 学习笔记--11---内置对象(Global/Math)

    练习中使用的浏览器是IE10,如果各位朋友有不同意见或者遇到浏览器不兼容问题,希望指正 1.内置对象的定义:有ECMAScript实现提供的.不依赖与宿主环境的对象,在ECMAScript运行之前就已 ...

  5. protobuf的安装和使用

    以下全部基于win7系统. protobuf是什么,有什么用网上说的已经很多了.这里就是说一下怎么使用.就当给自己做个笔记吧. .proto文件的语法什么的也请网上查看,挺多的. 第一步: 下载pro ...

  6. 浅谈c#枚举

    结构中的成员可以赋值,枚举呢....是取值,只读的 以下情况可以考虑将类创建为结构:(1)如果一个类其中的字段非常少,所有字段占用的内存总量不超过8.16字节:(2)如果一个类中的字段都是值类型: 关 ...

  7. sprytabbedpanels.js库之在页面中插入Tabbed Panels

    向页面加入sprytabbedpanels.js文件.<script src="SpryAssets/SpryTabbedPanels.js" type="text ...

  8. Altium Designer 使用小结

    今天刚把做好的PCB文件交给工厂去制板,阶段工作告一段落,来一个小总结. 前一段时间复习完C语言之后,在中国知网上搜索用单片机实现的小制作,找比较有意思,又不需要太多外专业知识的东西,然后就相中了超声 ...

  9. Codeforces Round #271 (Div. 2) F ,E, D, C, B, A

    前言:最近被线段树+简单递推DP虐的体无完肤!真是弱! A:简单题,照着模拟就可以,题目还特意说不用处理边界 B:二分查找即可,用lower_lound()函数很好用 #include<stri ...

  10. jQuery一些常用特效方法使用实例

    1. jQuery fadeIn() 用于淡入已隐藏的元素. 语法: $(selector).fadeIn(speed,callback); 实例: $("button").cli ...