HDU 4630 No Pain No Game 树状数组+离线查询
思路参考 这里。
#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 树状数组+离线查询的更多相关文章
- HDU 4630 No Pain No Game 树状数组+离线操作
题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...
- HDU 4630 No Pain No Game(树状数组)
题目链接 看的别人的题解,离线之后,按r排序,枚举1-n,利用pre[j],存上次j的倍数出现的位置,树状数组里统计的当前位置到最后的最大值,树状数组是求区间最值其实应该很麻烦的,但是此题用法只是求到 ...
- 4630 no pain no game 树状数组
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4630 题意:给你N个数,然后给你M个询问,每个询问包含一个l 一个r,问你lr 这个区间中任意两个数最 ...
- HDU 5869 Different GCD Subarray Query 树状数组+离线
Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...
- bzoj 2743 树状数组离线查询
我们按照询问的右端点排序,然后对于每一个位置,记录同颜色 上一个出现的位置,每次将上上位置出现的+1,上次出现的-1,然后 用树状数组维护就好了 /************************** ...
- HDU 3333 树状数组离线查询
题目大意: 询问区间内不同种类的数的数值之和 这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突 我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的 ...
- 【树状数组+离线查询】HDU 3333 Turing Tree
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/H [题意] 给定一个数组,查询任意区间内不同数字之和. (n<=30000 ...
- SPOJ DQUERY树状数组离线or主席树
D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ...
- hdu 5869 区间不同GCD个数(树状数组)
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
随机推荐
- Could not load file or assembly 'Microsoft.Office.Interop.Word, Version=14.0
参考地址一:点击这里 参考地址二:点击这里 解决方法: 使用office COM元件,电脑里必须要有相对应的版本,比如 Excel 14.0是对应Excel 2010 Excel 12.0是对应Exc ...
- 序列化Color对象
如下: public class Class2 { [XmlIgnore] public Color Color1 { get { return color1; } set { color1 = va ...
- win8.1 环境下搭建PHP5.5.6+Apache2.4.7
本文主要阐述在windows8及win8.1 环境下搭建PHP5.5.6+Apache2.4.7. 1.软件准备 apache 2.4.7:http://pan.baidu.com/s/1iUPif ...
- switch语句的使用,非常好
这是谭浩强课本上枚举类型的例子,但是我贴这个例子的代码不是因为枚举类型,是因为这个代码使用switch语句用得非常好,值得一贴. 题目是这样的:有红.黄.蓝.白.黑5中颜色的球若干,依次取出3个球,求 ...
- imageNamed 与 imageWithContentsOfFile的区别
如题,是不是大家为了方便都这样加载图片啊 myImage = [UIImage imageNamed:@"icon.png"];那么小心了这种方法在一些图片很少,或者图片很小的程序 ...
- JS获取节点方法
1. 通过顶层document节点获取:(1) document.getElementById(elementId):该方法通过节点的ID,可以准确获得需要的元素,是比较简单快捷的方法.如果页面上含有 ...
- Unity3D之Assetbundle
原地址: Unity3D之Assetbundle 有几个地方需要注意下 1.如何解决资源重复加载的问题 2.初始化了就直接出现在场景中了 感觉怪怪的 3.标红的地方要注意下 prefab上挂载的脚 ...
- ES6中的高阶函数:如同 a => b => c 一样简单
作者:Sequoia McDowell 2016年01月16日 ES6来啦!随着越来越多的代码库和思潮引领者开始在他们的代码中使用ES6,以往被认为是"仅需了解"的ES6特性变成了 ...
- POJ 1759
Garland Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1236 Accepted: 547 Descriptio ...
- POJ 2724
Purifying Machine Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4014 Accepted: 1127 ...