题意:给定\(a[1...n]\),多次询问\([L,R]\)中的任意一对数使得\(gcd(a_i,a_j)\)最大

对于gcd,区间内至少存在两个相同的因子才能作为合法的解,存在两个相同因子且最大就是最优的解

对区间右端点进行离线排序,用线段树维护\([L,R]\)内最大的gcd(存在两次以上的因子)

具体的更新策略:记录因子\(j\)的上一次出现的地方\(last_j\),当\(last_j\)已存在时再插入\(last_j\)就能维护两次以上的信息,离线处理保证了后面的因子不会插入到当前查询范围的某个\(last_j\)中,具体看代码

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define print(a) printf("%lld",(ll)a)
#define println(a) printf("%lld\n",(ll)a)
#define printbk(a) printf("%lld ",(ll)a)
#define IOS ios::sync_with_stdio(0)
using namespace std;
const int MAXN = 5e4+11;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct QAQ{
int l,r,id;
bool operator < (const QAQ &orz)const{
return r<orz.r;
}
}b[MAXN];
int ans[MAXN],a[MAXN],last[MAXN];
struct ST{
#define lc o<<1
#define rc o<<1|1
int mx[MAXN<<2];
void pu(int o){
mx[o]=max(mx[lc],mx[rc]);
}
void build(int o,int l,int r){
mx[o]=0;
if(l==r) return;
int mid=l+r>>1;
build(lc,l,mid);
build(rc,mid+1,r);
}
void update(int o,int l,int r,int k,int v){
if(l==r){mx[o]=max(mx[o],v);return;}
int mid=l+r>>1;
if(k<=mid) update(lc,l,mid,k,v);
else update(rc,mid+1,r,k,v);
pu(o);
}
ll query(int o,int l,int r,int L,int R){
if(L<=l&&r<=R) return mx[o];
int mid=l+r>>1;
ll ans=0;
if(L<=mid) ans=max(ans,query(lc,l,mid,L,R));
if(R>mid) ans=max(ans,query(rc,mid+1,r,L,R));
return ans;
}
}st;
int main(){
int T=read();
while(T--){
int n=read();
rep(i,1,n) a[i]=read();
int m=read();
memset(ans,0,sizeof ans);
memset(last,0,sizeof last);
int cur=1;
rep(i,1,m){
b[i].l=read();
b[i].r=read();
b[i].id=i;
}
sort(b+1,b+1+m);
st.build(1,1,n);
for(int i=1;i<=n;i++){
for(ll j=1;j*j<=a[i];j++) if(a[i]%j==0){
if(last[j]) st.update(1,1,n,last[j],j);
if(last[a[i]/j]&&a[i]!=j*j) st.update(1,1,n,last[a[i]/j],a[i]/j);
last[j]=i;
last[a[i]/j]=i;
}
while(cur<=m&&b[cur].r==i){
ans[b[cur].id]=st.query(1,1,n,b[cur].l,b[cur].r);
++cur;
}
}
rep(i,1,m) println(ans[i]);
}
return 0;
}

HDU - 4630 离线处理区间点对问题的更多相关文章

  1. HDU - 4630 No Pain No Game (线段树 + 离线处理)

    id=45786" style="color:blue; text-decoration:none">HDU - 4630 id=45786" style ...

  2. hdu 4630 查询[L,R]区间内任意两个数的最大公约数

    No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. E - No Pain No Game 线段树 离线处理 区间排序

    E - No Pain No Game  HDU - 4630 这个题目很好,以后可以再写写.这个题目就是线段树的离线写法,推荐一个博客:https://blog.csdn.net/u01003321 ...

  4. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  6. 区间的关系的计数 HDU 4638 离线+树状数组

    题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...

  7. HDU 4630 No Pain No Game(2013多校3 1010题 离线处理+树状数组求最值)

    No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. HDU 4630 No Pain No Game (线段树+离线)

    题目大意:给你一个无序的1~n的排列a,每次询问[l,r]之间任取两个数得到的最大gcd是多少 先对所有询问离线,然后把问题挂在区间的左端点上(右端点也行) 在预处理完质数,再处理一个next数组,表 ...

  9. Turing Tree HDU - 3333 (树状数组,离线求区间元素种类数)

    After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because ...

随机推荐

  1. Mysql--关于数值字段的比较问题

    今天在进行数据库查询的过程中,因为需要比较一条记录中两个字段的大小问题 select * from cyber_download_rate where measure_time between '20 ...

  2. 布局分析002:入门级的CSS导航弹出菜单

    这种弹出菜单非常有意思,也有记录的意义,甚至可以说,掌握了这种弹出菜单,基本上CSS掌握的差不多. 主要涉及下面三个重要知识: CSS的继承性质. relative absolute定位. 子选择符& ...

  3. 与table有关的布局

    当IE8发布时,它将支持很多新的CSS display属性值,包括与表格相关的属性值:table.table-row和table-cell,它也是最后一款支持这些属性值的主流浏览器.它标志着复杂CSS ...

  4. Jquery 自定义插件写法(示例)

    (function ($) { $.SmsHelper = $.SmsHelper || {}; $.extend($.SmsHelper, { //插件具体实现代码 yzmnum: 60, Ajax ...

  5. Webservice发布

    此文甚好,转载自:http://blog.163.com/java_player@126/blog/static/127930738200981555021925/ 某些地方笔者已经加以改进. 使用工 ...

  6. C# Aes CryptoStream Specified padding mode is not valid for this algorithm的解決方法

    //解密數據            using (var ss = File.OpenRead(@"d:\qq.d.flac"))            {             ...

  7. apache mpm的一些问题

    win2003系统下apache环境,mpm_winnt.c模式,优化参数: ThreadsPerChild 说明:每个子进程建立的线程数,默认值:64,最大值:1920.网上查询资料建议设置在100 ...

  8. Solr(一) 安装部署环境

    Solr运行环境 第一步:安装java jdk 第二步:安装tomcat服务器 安装过程:参考http://jingyan.baidu.com/article/870c6fc33e62bcb03fe4 ...

  9. NPOI+Json文件解析Excel

    记点笔记,加深印象!最近有个导入Excel工能需要完成,Excel列名是中文的,导入Excel我用的NPOI插件,如果不对Excel做解析,列名有可能会给我带来一些字符方面的麻烦,于是想到了一个比较l ...

  10. Kafka与.net core(二)zookeeper

    1.zookeeper简单介绍 1.1作用 zookeeper的作用是存储kafka的服务器信息,topic信息,和cunsumer信息.如下图: 而zookeeper是个什么东西呢?简单来说就是一个 ...