Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33258 | 郭澍宇 | 【J】T3 | C++ | 运行超时 | 50 | 1000 MS | 1048 KB | 1007 | 2024-10-04 18:55:48 |
#pragma GCC optimize(2) #include<bits/stdc++.h> const int Max= 100000; using namespace std; int dp[100005],w[100005]; int n,q; int main(){ for(int i = 1;i<=Max;i++)dp[i]=0x3f3f3f3f; scanf("%d%d",&n,&q); for(int i = 1;i<=n;i++){ scanf("%d",&w[i]); } dp[n]=w[n]; for(int i = n-1 ; i>=1 ; i--){ w[i]=min(w[i],w[i+1]); dp[i]=w[i]; } for(int i = 2;i<=Max;i++){ for(int j = 1;;j++){ int z=Max>i*j ? i*j : Max; dp[z]=dp[z]<dp[i]+dp[j]?dp[z]:dp[i]+dp[j]; if(z>=Max)break ; } } for(int i = Max - 1 ; i >= 1 ; i --) { dp[i] = dp[i] > dp[i + 1] ? dp[i+1] : dp[i] ; } while(q--){ int x,y; cin>>x>>y; if(x<=y){ printf("0\n"); continue; } int l = 1, r = x,ans=x; while (l < r) { int mid = l + r >> 1; if (x / mid <= y){r = mid;} else l = mid + 1; } printf("%d\n",dp[l]); } return 0; }