RT,我的方法是枚举每一种区间的最大值 i ,然后取出最长能够得到的区间,判断这个区间的 ∑fi>=m 是否成立。
prei表示从第 i 个点开始往前第一个 ≥si的数的下标
sufi表示从第 i 个点开始往后第一个 ≥si的数的下标
这个做法只拿了 80 分,#6 和#7 WA了。
求助各位大佬
#include<cstdio>
#include<iomanip>
#define int long long
#define INF 0x7f7f7f7f7f7f7f7f
using namespace std;
const int N=1e5+50;
int f[N],s[N],sum[N],pre[N],suf[N];
int n,m;
inline int Min(int a,int b){return a<b?a:b;}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld%lld",&f[i],&s[i]),sum[i]=sum[i-1]+f[i];
s[0]=s[n+1]=INF,pre[1]=0,suf[n]=n+1;
for(int i=n;i>=1;i--){
int pos=i+1;
while(s[pos]<s[i]&&pos!=n+1) pos=suf[pos];
suf[i]=pos;
}
int mine=INF;
for(int i=1;i<=n;i++){
int pos=i-1;
while(s[pos]<s[i]&&pos) pos=pre[pos];
pre[i]=pos;
if(sum[suf[i]-1]-sum[pre[i]]>=m) mine=Min(mine,s[i]);
}
printf("%lld\n",mine);
return 0;
}