1. 程式人生 > >【模板】倍增

【模板】倍增

for bits 最大的 strong its sin 越界 can space

題目:給定一個序列a[ ],共 N 個正數,現有 M 次詢問,每次給出一個 T ,需要求出最大的 k ,滿足\(\Sigma_{i=1}^ka[i]<=T\)

方法一:二分
方法二:倍增

倍增的思想很簡單,即:在當前符合條件的區間之上,再拓展長度為2的冪次長度的區間,以便更快速地求得結果。

代碼如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;

int sum[maxn],n,m;

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&sum[i]);
        sum[i]+=sum[i-1];//前綴和優化
    }

    while(m--){
        int t;scanf("%d",&t);
        
        int k=0,p=1;//初始化左端點值為一個合法答案,倍增系數為1
        while(p){
            if(k+p>n){p>>=1;continue;}//越界直接返回

            if(sum[k+p]<=t)k+=p,p<<=1;
            else p>>=1;
        }
        printf("%d\n",k);
    }
    return 0;
}

【模板】倍增