求助 hdu4630 《算法竞赛》上的题,玄关
  • 板块学术版
  • 楼主Genshin_ZFYX
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/13 11:38
  • 上次更新2025/1/13 11:40:31
查看原帖
求助 hdu4630 《算法竞赛》上的题,玄关
1073342
Genshin_ZFYX楼主2025/1/13 11:38

https://vjudge.net/problem/HDU-4630

code:

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
vector<int>v[N];
int n,m,a[N],pre[N],t[N],ans[N];
struct node{
	int l,r,id;
}q[N];
bool cmp(node x,node y){return x.l>y.l;}
int lb(int x){return x&(-x);}
int query(int x)
{int res=0;for(;x>=1;x-=lb(x))res=max(res,t[x]);return res;}
void update(int x,int y)
{for(;x<=n;x+=lb(x))t[x]=max(t[x],y);}
signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	for(int i=2;i<N;i++)
		for(int j=i;j<N;j+=i)
			v[j].push_back(i);
	int T;cin>>T;
	while(T--)
	{
		memset(t,0,sizeof(t));
		memset(pre,0,sizeof(pre));
		cin>>n;
		for(int i=1;i<=n;i++)cin>>a[i];
		cin>>m;
		for(int i=1;i<=m;i++)cin>>q[i].l>>q[i].r,q[i].id=i;
		sort(q+1,q+1+m,cmp);
		int it=n+1;
		for(int i=1;i<=m;i++)
		{
			for(it--;it>=q[i].l;it--)
				for(auto &j:v[a[it]])
				{
					if(pre[j])update(pre[j],j);
					pre[j]=it;
				}
			it++;
			if(q[i].l!=q[i].r)ans[q[i].id]=query(q[i].r);
			else ans[q[i].id]=0;
		}
		for(int i=1;i<=m;i++)
		cout<<ans[i]<<'\n';
	}
	return 0;
 } 
2025/1/13 11:38
加载中...