区间的连续段 - 倍增DP

题目链接:https://ac.nowcoder.com/acm/contest/82/B
图片说明
图片说明

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

LL a[1000005], s[1000005]={0}, f[1000005][25];
int main(){

    int n, m, k; scanf("%d%d%d", &n, &m, &k);
    for(int i=1; i<=n; i++){
        scanf("%lld", &a[i]);
        s[i]=s[i-1]+a[i];
    }
    for(int i=1; i<=n; i++){
        int pos=upper_bound(s+i, s+n+1, (s[i-1]+k))-s;
        f[i][0]=pos;
    }
    for(int i=0; i<=22; i++){
        f[n+1][i]=n+1;
    }
    for(int i=1; i<=22; i++){
        for(int k=1; k<=n; k++){
            f[k][i]=f[f[k][i-1]][i-1];
        }
    }
    while(m--){
        int x, y, ans=0; scanf("%d%d", &x, &y);
        for(int i=22; i>=0; i--){
            if(f[x][i]&&f[x][i]<=y){
                ans+=(1<<i);
                x=f[x][i];
            }
        }
        //如果a[x]>k那么f[x][i]=i这个位置跳在原位置
        if(f[x][0]>y){
            cout<<ans+1<<endl;
        }
        else{
            cout<<"Chtholly"<<endl;
        }
    }

    return 0;
}
全部评论

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务