rt,谢谢。
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
const int N=1e5+10,M=1e9;
int n,rt,s,t,id,cnt,ans=2e18;
int dp[N];
pair<int,int>b[N];
struct tree
{
int l,r,x;
}f[N<<5];
struct ccf
{
int k,b;
}a[N<<1];
int num(int id,int x)
{
return a[id].k*x+a[id].b;
}
int cmp(int x,int y)
{
if(x>y)return 1;
else if(x<y)return -1;
else return 0;
}
void add(int &k,int l,int r,int id)
{
if(!k)k=++cnt;
int &now=f[k].x,mid=l+(r-l)/2,chk=cmp(num(now,mid),num(id,mid));
if(chk==1)swap(id,now);
int chkl=cmp(num(now,l),num(id,l)),chkr=cmp(num(now,r),num(id,r));
if(chkl==1)add(f[k].l,l,mid,id);
if(chkr==1)add(f[k].r,mid+1,r,id);
}
void change(int &k,int l,int r,int x,int y,int id)
{
if(l>y||r<x)return ;
if(!k)k=++cnt;
if(x<=l&&r<=y)
{
add(k,l,r,id);
return ;
}
int mid=l+(r-l)/2;
change(f[k].l,l,mid,x,y,id);
change(f[k].r,mid+1,r,x,y,id);
}
int ask(int k,int l,int r,int x)
{
if(!k||l>x||r<x)return 1e18;
if(l==r)return num(f[k].x,x);
int mid=l+(r-l)/2;
return min(num(f[k].x,x),min(ask(f[k].l,l,mid,x),ask(f[k].r,mid+1,r,x)));
}
bool cmpp(pair<int,int>a,pair<int,int>b)
{
return a.fi>b.fi;
}
signed main()
{
cin>>n>>s>>t;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&b[i].fi,&b[i].se);
if(s==b[i].se)id=i;
}
swap(b[id],b[1]);
sort(b+2,b+1+n,cmpp);
a[0].b=1e18,a[1]={b[1].fi,-b[1].fi*b[1].se},a[2]={-b[1].fi,b[1].fi*b[1].se};
change(rt,-M,M,b[1].se,M,1),change(rt,-M,M,-M,b[1].se,2);
for(int i=2;i<=n;i++)
{
if(b[i].se>t)break;
dp[i]=ask(rt,-M,M,b[i].se);
a[i*2]={b[i].fi,dp[i]-b[i].fi*b[i].se},a[i*2+1]={-b[i].fi,dp[i]+b[i].fi*b[i].se};
change(rt,-M,M,b[i].se,M,i*2),change(rt,-M,M,-M,b[i].se,i*2+1);
ans=min(ans,dp[i]+b[i].fi*(t-b[i].se));
}
cout<<ans;
return 0;
}