Boring Problem

本文介绍了一道经典的倍增思想算法题目,并提供了完整的C++实现代码。文章通过实例讲解了如何利用倍增思想解决特定类型的问题,适用于算法学习者和竞赛选手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

倍增思想的模板题,注意写法就行了。

#include<bits/stdc++.h>
#define ll long long
#define P pair<int, int>
#define PP pair<int,pair<int, int>>
#define pb push_back
#define pp pop_back
#define lson root << 1
#define INF (int)2e9 + 7
#define maxn (int)1e5 + 7
#define rson root << 1 | 1
#define LINF (unsigned long long int)1e18
#define mem(arry, in) memset(arry, in, sizeof(arry))
using namespace std;

int T, n, K, q;
int a[maxn], pos[maxn][20], use[maxn];
ll sum[maxn];

int get(ll x) {
    int l = 1, r = n + 1;
    while(l < r) {
        int mid = (l + r) >> 1;
        if(sum[mid] <= x) l = mid + 1;
        else r = mid;
    }
    return l;
}

void Inite() {
    mem(use, 0);
    mem(pos, -1);
    for(int i = 1; i <= n; i++) {
     // 不合法的位置就不要跳
if(a[i] > K) use[i] = 1; else pos[i][0] = get(sum[i - 1] + K); use[i] += use[i - 1]; } for(int i = 1; (1 << i) <= n; i++) { for(int j = 1; j <= n; j++) if(pos[j][i - 1] != -1) { pos[j][i] = pos[pos[j][i - 1]][i - 1]; } } } int main() { scanf("%d", &T); while(T--) { mem(a, 0); scanf("%d %d %d", &n, &K, &q); for(int i = 1; i <= n; i++) scanf("%d", &a[i]), sum[i] = sum[i - 1] + (ll)a[i]; Inite(); while(q--) { int l, r; scanf("%d %d", &l, &r); if(use[r] - use[l - 1] > 0) { puts("-1"); continue; } int res = 0; for(int i = 19; i >= 0; i--) { if(pos[l][i] <= r && pos[l][i] != -1) { l = pos[l][i]; res += (1 << i); } } printf("%d\n", res + 1); } } return 0; }

 

转载于:https://www.cnblogs.com/zgglj-com/p/9233662.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值