萌新球调 abc F WA13
  • 板块学术版
  • 楼主Aigony
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/5/27 21:55
  • 上次更新2023/10/23 14:32:29
查看原帖
萌新球调 abc F WA13
339128
Aigony楼主2023/5/27 21:55

一眼二分答案然而死活调不出来,怀疑是哪里爆 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

*/
2023/5/27 21:55
加载中...