天梯赛:药剂合成

MarcusL是一名杰出的药剂师,他以其深厚的魔法知识和独特的药剂配方而闻名。作为一名药剂师,他掌握了多种魔法基础药水的制作方法,并且还拥有一系列珍贵的魔兽材料。
这些魔兽材料是来自于神秘生物和神奇生物的身体组织、分泌物或其他宝贵的物质。每种魔兽材料都有其独特的属性和稀有度。MarcusL利用这些魔兽材料,可以调整药水的魔法效果。
药水的魔法效果由两个因素决定:基础魔法值和魔兽材料的稀有度。基础魔法值代表了药水中魔法的原始能量,而魔兽材料的稀有度则代表了其珍贵程度和对药水效果的影响力。
MarcusL独特的发现是,药水的魔法效果取决于基础魔法值与所选取的魔兽材料稀有度数值的最大公因数。最大公因数是指能够整除两个或多个数的最大正整数。
因此,MarcusL通过精心挑选和搭配魔兽材料,可以调整药水的魔法效果,使其符合特定需求或产生意想不到的效果。他不断探索和研究新的魔兽材料,并与其他药剂师分享他的发现,为整个魔法界带来了新的治疗和增强药剂的可能性。
现在,给定了 n 种魔兽材料的稀有度,以及 q 个询问。每个询问包含了一种魔法基础药水的基础魔法值和一个表示魔兽材料挑选区间范围的值。你的任务是对于每个询问,计算出所能获得的最大魔法效果值。

输入格式:

输入第一行为 n ,第二行包含 n 个数,第 i 个数代表了第 i 种魔兽材料的稀有度 a[i]。
第三行为 q 代表询问次数,接下来 q 行每行给出三个整数,第一个整数 k 代表魔法基础药水的基础魔法值,第二个整数 l 代表所能选取魔兽材料的左边界,第三个整数 r 代表能选取魔兽材料的右边界。

(n<=10000,a[i]<=3000,q<=1e5,k<=3000,1<=l<=r<=n)

输出格式:

输出共q行,分别代表q次询问的所能获得的最大魔法效果值。

输入样例:

3
1 2 3
2
1 1 3
2 2 3

输出样例:

1
2

源代码:

 

#include<bits/stdc++.h>
using namespace std;

const int N=10010;

int a[N];
int b[N][3010];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        memcpy(b[i],b[i-1],sizeof b[i]);
        scanf("%d",&a[i]);
        for(int j=1;j*j<=a[i];j++)
        {
            if(a[i]%j==0)
            {
                b[i][j]++;
                if(j*j!=a[i])b[i][a[i]/j]++;
            }
        }
    }
    int m;
    scanf("%d",&m);
    while(m--)
    {
        int k,l,r;
        int ans=0;
        cin>>k>>l>>r;
        for(int i=1;i*i<=k;i++)
        {
            if(k%i==0)
            {
                int t=k/i;
                if(b[r][i]-b[l-1][i])ans=max(ans,i);
                if(b[r][t]-b[l-1][t])ans=max(ans,t);
            }
        }
        cout<<ans<<endl;
    }
}

问题: 

我选择写本题的原因是本题思路特别巧妙,对于查询,如果直接遍历一定超时,所以我主要卡在怎么类似于求区间和的形式在o(1)判断出这个因子是否存在于该区间内,这时用到了memcpy函数,我们把上一次的结果拷贝到当前的数组内,只要判断该区间的r和l-1是否大于0即可,因为时间限制卡的很紧,所以开的二维数组最好根据题意来开,不要开的很大,会超时的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值