做完之后看了一圈题解没发现用二分的,那本蒟蒻就来写一下二分吧
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long//某人不开long long最后一个样例没过
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using ll = long long;
const int M = 10000010;
const int INF = 0x3f3f3f3f;
int n, m, k, T;
int x;
int a[M];
int sum[M];
bool check(int r,int l){
return sum[r]-sum[l-1]>=x;
}
signed main()
{
IOS;
cin>>n>>x;
for(int i=1;i<=n;++i){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
int l=INF,len=INF;
for(int i=1;i<=n;++i){
//二分右端点,i表示的是左端点
int L=i+1;int R=n;
int cur=INF;
while(L<=R){
int mid=(L+R)>>1;
if(check(mid,i)){
R=mid-1;
cur=mid-i;
}else {
L=mid+1;
}
}
if(cur<len){
len=cur;
l=i;
}else if(cur==len) {
if(i<l){
l=i;
len=cur;
}
}//其实这一段不要也无所谓,前面得到的结果l更小
}
cout<<l<<" "<<l+len;
return 0;
}

京公网安备 11010502036488号