【模板】倍增
阿新 • • 發佈:2018-10-24
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; }
【模板】倍增