Title
P4085 [USACO17DEC]Haybale Feast G
Solution
注意rmq中的log要预处理好,还有注意是否要long long
注意本题二分的是r,所以判断条件的时候不要习惯性的打成r-l
Code
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define rep(i,x,y) for(ll i=x;i<=y;i++)
using namespace std;
const ll N=1e5+5;
ll n,m,a[N],b[N],f[N][18],w,pre[N],g[N],ans=2147483647;
int main(){
scanf("%lld%lld",&n,&m);
g[0]=-1;
rep(i,1,n) g[i]=g[i>>1]+1; w=g[n];
rep(i,1,n) scanf("%lld%lld",&a[i],&b[i]),f[i][0]=b[i],pre[i]=pre[i-1]+a[i];
rep(j,1,w) rep(i,1,(n-(1<<(j-1))+1)) f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
rep(i,1,n) {
int l=i,r=n;
if (pre[r]-pre[l-1]<m) break;
while(l<=r){
int mid=(l+r)>>1;
if (pre[mid]-pre[i-1]>m) r=mid-1; else
if (pre[mid]-pre[i-1]==m) {r=mid; break;} else //"pre[l-1]"->"pre[i-1]"
l=mid+1;
}
w=g[r-i+1];
ans=min(ans,max(f[i][w],f[r-(1<<w)+1][w]));
}
return 0&printf("%lld",ans);
}