和题解区差不多的代码不知为什么TLE了。
#include<bits/stdc++.h>
#define ll long long
#define pl p<<1
#define pr p<<1|1
using namespace std;
long long read(){
long long x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=1e5+10;
const ll inf=1e18;
int n,pos,lst[N],l1=1,z[N],t;
ll w[N],h[N],l,dp[N],sum;
struct Tree{
int l,r;
ll f,mx,tag;
}a[N*4];
void pushup(int p){
a[p].f=min(a[pl].f,a[pr].f);
a[p].mx=min(a[pl].mx,a[pr].mx);
}
void pushdown(int p){
if(a[p].tag){
a[pl].tag=a[pr].tag=a[p].tag;
a[pl].mx=a[pl].f+a[pl].tag;
a[pr].mx=a[pr].f+a[pr].tag;
a[p].tag=0;
}
}
void build(int p,int l,int r){
a[p].l=l;a[p].r=r;
a[p].mx=a[p].f=inf;
a[p].tag=0;
if(l==r)
return;
int mid=(l+r)>>1;
build(pl,l,mid);
build(pr,mid+1,r);
}
void change1(int p,int l,int r,ll v){
if(l<=a[p].l&&a[p].r<=r){
a[p].mx=a[p].f+v;
a[p].tag=v;
return;
}
pushdown(p);
int mid=(a[p].l+a[p].r)>>1;
if(l<=mid)
change1(pl,l,r,v);
if(r>mid)
change1(pr,l,r,v);
pushup(p);
}
void change2(int p,int x){
if(a[p].l==a[p].r){
a[p].mx=inf;
a[p].f=dp[x-1];
return;
}
pushdown(p);
int mid=(a[p].l+a[p].r)>>1;
if(x<=mid)
change2(pl,x);
else
change2(pr,x);
pushup(p);
}
ll ask(int p,int l,int r){
if(a[p].l==a[p].r)
return a[p].mx;
pushdown(p);
int mid=(a[p].l+a[p].r)>>1;
ll ans=inf;
if(l<=mid)
ans=min(ans,ask(pl,l,r));
if(r>mid)
ans=min(ans,ask(pr,l,r));
return ans;
}
int main(){
n=read();l=read();
for(int i=1;i<=n;i++){
h[i]=read();
w[i]=read();
}
z[++t]=1;
for(int i=2;i<=n;i++){
while(t&&h[i]>h[z[t]])
t--;
lst[i]=z[t];
z[++t]=i;
}
build(1,1,n);
for(int i=1;i<=n;i++){
sum+=w[i];
while(l1<=i&&sum>l)
sum-=w[l1++];
pos=l1;
change2(1,i);
if(lst[i]+1<=i)
change1(1,lst[i]+1,i,h[i]);
dp[i]=ask(1,pos,i);
}
write(dp[n]);
return 0;
}