牛客练习赛14 B:区间的连续段(倍增打表)
发布日期:2021-06-30 16:06:20 浏览次数:2 分类:技术文章

本文共 645 字,大约阅读时间需要 2 分钟。

dp[i][j]表示从位置 i 开始分 2^j 段的 结束点+1的位置
再进行倍增打表即可,具体看代码

#include
using namespace std;typedef long long ll;const int maxn=1000000+100;int dp[maxn][25];ll sum[maxn];int main(){ int n,m; ll k; scanf("%d%d%lld",&n,&m,&k); sum[0]=0; for(int i=1;i<=n;i++) scanf("%lld",&sum[i]),sum[i]+=sum[i-1]; for(int i=0;i<=21;i++) dp[n+1][i]=n+1; for(int i=n;i>=1;i--){ dp[i][0]=upper_bound(sum+1,sum+1+n,sum[i-1]+k)-sum; for(int j=1;j<=21;j++) dp[i][j]=dp[dp[i][j-1]][j-1]; } while(m--){ int l,r; scanf("%d%d",&l,&r); ll cnt=0; for(int i=21;i>=0;i--){ if(dp[l][i]<=r) cnt+=(1<
r) printf("%lld\n",cnt+1); else printf("Chtholly\n"); }}

转载地址:https://kaven.blog.csdn.net/article/details/81391014 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Wannafly挑战赛21 C:大水题
下一篇:Wannafly挑战赛10 D:小H的询问(线段树区间合并)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月18日 16时15分38秒