HDU - 4630 离线处理区间点对问题
题意:给定\(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 离线处理区间点对问题的更多相关文章
- HDU - 4630 No Pain No Game (线段树 + 离线处理)
id=45786" style="color:blue; text-decoration:none">HDU - 4630 id=45786" style ...
- hdu 4630 查询[L,R]区间内任意两个数的最大公约数
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- E - No Pain No Game 线段树 离线处理 区间排序
E - No Pain No Game HDU - 4630 这个题目很好,以后可以再写写.这个题目就是线段树的离线写法,推荐一个博客:https://blog.csdn.net/u01003321 ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 区间的关系的计数 HDU 4638 离线+树状数组
题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...
- 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 ...
- HDU 4630 No Pain No Game (线段树+离线)
题目大意:给你一个无序的1~n的排列a,每次询问[l,r]之间任取两个数得到的最大gcd是多少 先对所有询问离线,然后把问题挂在区间的左端点上(右端点也行) 在预处理完质数,再处理一个next数组,表 ...
- Turing Tree HDU - 3333 (树状数组,离线求区间元素种类数)
After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because ...
随机推荐
- [Training Video - 4] [Groovy] String Functions
def x="I like to read books before bed" def temp = x.split(" ") log.info "S ...
- 【转载】RHEL / CentOS 7 用 Yum 安裝 MySQL 5.6
久久未更新... 换好工作出去玩耍了一趟, 现在安装机器啦~ 装一个mysql 到centos 7, 一次转载一篇文章, 记录下: 原文地址:http://www.phpini.com/mysql/r ...
- Under-sampling
Under sampling When the signal frequency is high, and the tester frequency can’t catch the signal ...
- 20155316 2016-2017-2 《Java程序设计》第6周学习总结
教材学习内容总结 IO操作的目标 从数据源当中读取数据,以及将数据写入到数据目的地当中: I/O的来源地与目的地多种多样 I/O的流向:输入流.输出流.参照物 IO的分类方法 输入流\输出流: 字节流 ...
- CocoaPods安装和使用教程[转]
目录 CocoaPods是什么? 如何下载和安装CocoaPods? 如何使用CocoaPods? 场景1:利用CocoaPods,在项目中导入AFNetworking类库 场景2:如何正确编译运行一 ...
- EBS11i - 常用Profile
Profile Name 说明 设置建议 FND: Enable Cancel Query 当执行一个超长时间的查询时,会出现一个 Cancel窗口,允许用户取消.比如我们在SO 界面没有输入条件 ...
- 咏南中间件修正了一处BUG,调用中间件插件会报:非法访问
咏南中间件修正了一处BUG,调用中间件插件会报:非法访问将以下方法修改成如下的代码即可function TServerMethods1.GetSvrData(const accountNo, defi ...
- 看懂gc日志
使用的是:+PrintGCDetails -XX:+PrintGCTimeStamps 输出的日志格式: [Times: user=0.03 sys=0.00, real=0.01 secs] 363 ...
- 去掉easyui tree 的默认图标
$(".tree-icon,.tree-file").removeClass("tree-icon tree-file"); $(".tree-ico ...
- ClamAV学习【9】——cvd文件解析及cli_untgz函数浏览
这个cli_untgz函数,是用来解压CVD文件的. 那么,就刚先搞清楚CVD文件的功能作用.下了源码,我们会发现,没有前面提到的*.mdb或者*.hbd等病毒签名文件.原因就是,那些文件都是由CVD ...