1 条题解

  • 0
    @ 2025-8-24 22:51:52

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zjc5
    zjc

    搬运于2025-08-24 22:51:52,当前版本为作者最后更新于2024-08-21 19:54:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目链接

    思路:

    fif_i 是用 a1~aia_1\text{\textasciitilde}a_i 凑出小于 ai+1a_{i+1} 的面额所用最大纸币数,mximx_i 表示符合此条件的最小值。

    ai+11=kai+ba_{i+1}-1=ka_i+b

    1. mxi1bmx_{i-1}\le b,显然 mxi=kai+mxi1mx_i=ka_i+mx_{i-1}
    2. mxi1>bmx_{i-1}\gt b,则所有 kai+c(0cb)ka_i+c(0\le c\le b) 的纸币数必然小于 k+fi1k+f_{i-1},即小于等于 k1+fi1k-1+f_{i-1},而 k1+fi1k-1+f_{i-1} 刚好对应 (k1)ai+mxi1(k-1)a_i+mx_{i-1}

    综上所述,$mx_i=\lfloor\frac{a_{i+1}-mx_{i-1}-1}{a_i}\rfloor a_i+mx_{i-1}$。

    注意到若 aia_i 的系数不能为零,则选出的 ata_t 必须满足 at+1>at+mxt1a_{t+1}\gt a_t+mx_{t-1}

    查询答案时二分查找到满足 apbia_p\le b_i 的最大的 pp,求答案的过程与预处理类似。

    时间复杂度:

    因为 at>mxt1>at1a_t\gt mx_{t-1}\gt a_{t-1} 所以 at<at+12a_t\lt \frac{a_{t+1}}2,又因为 atana_t\le a_nt2log(an)+1t\le 2\log(a_n)+1

    所以总时间复杂度是 O(n+qlog(min(log(an),n)))O(n+q\log(\min(\log(a_n),n)))

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=200010;
    int n,t,b[N],a[N],q,x,f[N],mx[N];
    signed main(){
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		cin>>a[i];
    	a[n+1]=2e18;
    	for(int i=1;i<=n;i++){
    		if(a[i]+mx[t]<a[i+1]){
    			b[++t]=a[i];
    			f[t]=f[t-1]+(a[i+1]-mx[t-1]-1)/b[t];
    			mx[t]=(a[i+1]-mx[t-1]-1)/b[t]*b[t]+mx[t-1];
    		}
    	}
    	cin>>q;
    	while(q--){
    		cin>>x;
    		int p=upper_bound(b+1,b+t+1,x)-b-1;
    		x=min(x,mx[p]);
    		cout<<mx[p-1]+(x-mx[p-1])/b[p]*b[p]<<" "<<f[p-1]+(x-mx[p-1])/b[p]<<"\n";
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    9352
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者