一眼二分答案然而死活调不出来,怀疑是哪里爆 int128,下大分了,有没有神仙帮忙看看 /kk
#include<bits/stdc++.h>
#define il inline
using namespace std;
#define int __int128
il int read()
{
int xr=0,F=1; char cr=getchar();
while(cr<'0'||cr>'9') {if(cr=='-') F=-1;cr=getchar();}
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
const int N=3e5+5;
int n,h;
struct node{
int t,d;
}a[N];
int mxl[N],mxr[N];
bool cmp(node x,node y) {return x.t<y.t;}
il int solve(int mid)
{
int res=0;
a[n+1].t=mid;a[0].t=1;
for(int x=n;x>=0;x--)
{
if(a[x].t>mid) continue;
if(a[x].t==a[x+1].t) continue;
if(!mxr[x+1])
{
res+=(mid-a[x].t+1)*mxl[x];
if(res>h) break;
// cout<<"res= "<<res<<endl;
continue;
}
int mx=ceil(1.0*mxl[x]/mxr[x+1]);
mx=max(mx,a[x].t),mx=min(mx,a[x+1].t);
int L=mxr[x+1]*mx,R=mxr[x+1]*(a[x+1].t-1);
if(L+R>h&&mx!=a[x+1].t) return h+1;
res+=(L+R)*(a[x+1].t-mx)/2;
if(res>h) break;
res+=(mx-a[x].t)*mxl[x];
if(res>h) break;
}
return res;
}
signed main()
{
n=read(),h=read();
for(int i=1;i<=n;i++) a[i].t=read(),a[i].d=read();
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++) mxl[i]=max(mxl[i-1],a[i].t*a[i].d);
for(int i=n;i;i--) mxr[i]=max(mxr[i+1],a[i].d);
int l=1,r=h;
while(l<r)
{
int mid=((l+r)>>1);
if(solve(mid)>=h) r=mid;
else l=mid+1;
}
printf("%lld\n",(long long)l);
// cout<<solve(6)<<endl;
return 0;
}
/*
2 20
2 2
5 1
*/