当前位置 : 主页 > 编程语言 > java >

计蒜客入门赛#2 数列 一次前缀和+二分区间(lower_bound)

来源:互联网 收集:自由互联 发布时间:2022-07-04
​​传送门​​​ 题意:好理解 思路:后面数太大,不能用暴力。考虑数比较大,但又是连续的区间,使用前缀和构建一个新的序列。 再二分这个序列的区间,寻找正好大于等于目标

​​传送门​​​ 题意:好理解
思路:后面数太大,不能用暴力。考虑数比较大,但又是连续的区间,使用前缀和构建一个新的序列。
再二分这个序列的区间,寻找正好大于等于目标(lower_bound)的数。
ps;被cin/cout坑死,输入输出量太大 还是scanf/printf稳

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
#define N 100010
using namespace std;
const ll maxn = 1000000 + 5;
const ll mod= 1e9+7;
//ll b[maxn];
//ll vis[maxn], Bool[maxn];
//ll a[maxn];
ll ai[maxn],a[maxn],num[maxn],sum[maxn];
using namespace std;
//vector<ll>a;
ll bsearch5(ll low,ll high,ll k){//直接套模板 k==key
ll mid;
while(low < high){
mid = low + (high -low)/2;//mid==被分的区间
if(sum[mid] >= k){
high = mid;
}
else{
low = mid + 1;
}
}
return num[high];
}
int main() {
ios::sync_with_stdio(false);
ll n,q;
scanf("%lld %lld",&n,&q);
//数字的个数
//数字
ll ty=n;
ll cnt=0;
while(n--)
{
cnt++;
//cin>>ai[cnt]>>num[cnt];
scanf("%lld %lld",&ai[cnt],&num[cnt]);
//sum+=ai[cnt];
//cnt++;
}
cnt=0;
ll t=0;
ll k;
for(ll i=1;i<=ty;i++)
{
sum[i]=ai[i]+t;
t=sum[i];
}

for(ll i=0;i<q;i++)
{
scanf("%lld",&k);
printf("%lld\n",bsearch5(1,ty,k));
}
return 0;
}


上一篇:计蒜客 颜色 dfs + set
下一篇:没有了
网友评论