求此分块复杂度
查看原帖
求此分块复杂度
235901
Always_Remember_It楼主2023/8/23 09:45
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
const int INF=1000000001;
int n,m,f[N],s[N],sum[N];
int num,l[N],r[N],in[N],maxn[N];
void block(){
    num=sqrt(n);
    if(num*num!=n) ++num;
    int lar=num;
    if(num*(num-1)<=n&&num*num!=n) --lar;
    for(int i=1;i<num;i++){
        l[i]=r[i-1]+1;
        r[i]=i*lar;
    }
    l[num]=r[num-1]+1;
    r[num]=n;
    for(int i=1;i<=r[num-1];i++){
        in[i]=(i-1)/lar+1;
    }
    for(int i=l[num];i<=n;i++){
        in[i]=num;
    }
    for(int i=1;i<=num;i++){
        maxn[i]=-INF;
        for(int j=l[i];j<=r[i];j++){
            maxn[i]=max(maxn[i],s[j]);
        }
    }
}
int ask(int lt,int rt){
    int res=-INF;
    if(in[lt]==in[rt]){
        for(int i=lt;i<=rt;i++){
            res=max(res,s[i]);
        }
        return res;
    }
    for(int i=lt;i<=r[in[lt]];i++){
        res=max(res,s[i]);
    }
    for(int i=in[lt]+1;i<in[rt];i++){
        res=max(res,maxn[i]);
    }
    for(int i=l[in[rt]];i<=rt;i++){
        res=max(res,s[i]);
    }
    return res;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<3)+(s<<1)+(ch^48);
        ch=getchar();
    }
    return s*f;
}
signed main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        f[i]=read(),s[i]=read();
        sum[i]=sum[i-1]+f[i];
    }
    int ans=INF;
    for(int i=1;i<=n;i++){
        if(sum[i]<m) continue;
        int p=upper_bound(sum+1,sum+i+1,sum[i]-m)-sum;
        ans=min(ans,ask(p,i));
    }
    printf("%lld\n",ans);
    return 0;
}
2023/8/23 09:45
加载中...