救救孩子QwQ
查看原帖
救救孩子QwQ
91681
Error_666楼主2020/6/26 11:43

写完P2365过来的,因为这里的Ti有负数,所以不满足决策单调性,那么就在凸包上二分即可。然后,全WA了?

我怀疑是不是二分写错了,于是拿这题的代码取交P2365却可以A掉。

不懂就问,蒟蒻求助。

#include <iostream>
#include <cstdio>
#define int long long
#define double long double
using namespace std;

const int N=300005;

int n,T,p1=1,p2=1;
int t[N],v[N],Q[N],f[N];

double X(int j) {return v[j];}
double Y(int j) {return f[j];}
double cal(int j1,int j2) {return (Y(j1)-Y(j2))/(X(j1)-X(j2));}

int binary(double v) {
    int l=p1,r=p2;
    while(l<r) {
		int mid=l+r>>1;
		if(cal(Q[mid],Q[mid+1])<=v) l=mid+1;
		else r=mid;
    }
    return Q[r];
}

signed main()
{
    freopen("tmp.in", "r", stdin);

    cin>>n>>T;
    for(int i=1;i<=n;i++) {
		scanf("%lld%lld",&t[i],&v[i]);
		t[i]+=t[i-1],v[i]+=v[i-1];
    }
    for(int i=1;i<=n;i++) {
		int j=binary(t[i]+T);
		f[i]=f[j]+t[i]*(v[i]-v[j])+T*(v[n]-v[j]);
		while(p1<p2 && cal(Q[p2-1],Q[p2])>=cal(Q[p2-1],i)) p2--;
		Q[++p2]=i;
    }
    cout<<f[n]<<endl;
    return 0;
}

2020/6/26 11:43
加载中...