思路:这题的处理方式和hdu4358有点像。我们用一个pre[x]表示约数x的倍数上次出现的位置,将查询按区间的右节点升序排序。num[i]的约数为j,如果pre[j]为0,就将pre[j]置为i;否则就update(pre[j],j),表示的意思是约数j肯定不是第一次出现,将pre[j]以前的区间更新最大约数。如果查询区间的右边界在i处,那么左边界在pre[j]以前就肯定就能取到j。因为num[pre[j]]和num[i]有一个公共约数j,且pre[j]和i被该查询区间所覆盖。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Maxn 50010
#define lowbit(x) (x&(-x))
using namespace std;
int C[Maxn],n,num[Maxn],pre[Maxn],q,ans[Maxn];
struct QT{
int l,r,i;
int operator <(const QT &temp) const
{
return r<temp.r;
}
}qt[Maxn];
int Sum(int pos)//往后找
{
int sum=;
while(pos<=n)
{
sum=max(sum,C[pos]);
pos+=lowbit(pos);
}
return sum;
}
void update(int pos,int val)//更新pos以前的位置
{
while(pos)
{
C[pos]=max(C[pos],val);
pos-=lowbit(pos);
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
memset(C,,sizeof(C));
memset(pre,,sizeof(pre));
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",num+i);
scanf("%d",&q);
for(i=;i<=q;i++)
{
scanf("%d%d",&qt[i].l,&qt[i].r);
qt[i].i=i;
}
sort(qt+,qt++q);
int r=;
for(i=;i<=n;i++)
{
if(r>q) break;
for(j=;j*j<=num[i];j++)
{
if(num[i]%j) continue;
if(pre[j]) update(pre[j],j);
pre[j]=i;
if(j*j==num[i]) break;
int k=num[i]/j;
if(pre[k]) update(pre[k],k);
pre[k]=i;
}
while(qt[r].r==i&&r<=q)
{
ans[qt[r].i]=Sum(qt[r].l);
r++;
}
}
for(i=;i<=q;i++)
printf("%d\n",ans[i]);
}
return ;
}

hdu 4630 树状数组的更多相关文章

  1. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  2. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. HDU 2852 (树状数组+无序第K小)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意:操作①:往盒子里放一个数.操作②:从盒子里扔掉一个数.操作③:查询盒子里大于a的第K小 ...

  4. HDU 4911 (树状数组+逆序数)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4911 题目大意:最多可以交换K次,就最小逆序对数 解题思路: 逆序数定理,当逆序对数大于0时,若ak ...

  5. hdu 5792(树状数组,容斥) World is Exploding

    hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...

  6. HDU 1934 树状数组 也可以用线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 或者是我自己挂的专题http://acm.hust.edu.cn/vjudge/contest/view. ...

  7. 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...

  8. 【模板】HDU 1541 树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意:给你一堆点,每个点右一个level,为其右下方所有点的数量之和,求各个level包含的点数. 题解: ...

  9. hdu 5147 树状数组

    题意:求满足a<b<c<d,A[a]<A[b],A[c]<A[d]的所有四元组(a,b,c,d)的个数 看到逆序对顺序对之类的问题一开始想到了曾经用归并排序求逆序对,结果 ...

随机推荐

  1. boost::bind 和 boost::function 基本用法

    这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...

  2. Umbraco 上传文件到另一个文件夹,而不是media files

    If you want to upload there media files to another place in the same instance of IIS, for example a ...

  3. 转载IEnumerable与IEnumerator区别

    public interface IEnumerable {     IEnumerator GetEnumerator(); }   public interface IEnumerator {   ...

  4. 本地搜索神器-Everything

    现在硬盘越来越大了,经常机器上一堆资料,要找的时候,无论是XP还是Win7,都要搜索半天. 如果使用Everything,可以大大的加快这个过程. 具体的评价请看http://www.appinn.c ...

  5. Date String转换

    这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new Date("2008-04-14&quo ...

  6. shape中的属性大全

    首先,看看事例代码 <shape> <!-- 实心 --> <solid android:color="#ff9999"/> <!-- 渐 ...

  7. MPAndroidChart

    该库的可扩展性强,代码相对规范,最近一次更新有很大改进,如果不喜欢AChartEngine的过于复杂可以考虑在此库的基础上开发自己的图表类. linechart 填充式lineChart 单条线的Li ...

  8. 使用Unity制作游戏关卡的教程(二)

    转自:http://gamerboom.com/archives/75554 作者:by Matthias Zarzecki 本文是“使用Unity制作<The Fork Of Truth> ...

  9. OA系统权限管理设计(转载)

    不论什么系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统加入亮点. l         不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是 ...

  10. poj1190生日蛋糕

    生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12277 Accepted: 4325 Description 7月1 ...