斜率优化过不了Hack 1
查看原帖
斜率优化过不了Hack 1
161697
ღꦿ࿐楼主2021/11/18 19:07

hack的第一个点没过

#include<bits/stdc++.h>
#define int long long 
#define lb long double
using namespace std;
const int N = 1e6+20;
template <typename T> inline void read(T &x){x=0;T f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-')f=-1;for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);x*=f;}
template<typename T,typename ...Args>void read(T &x,Args&...args){read(x),read(args...);}
template <typename T> void wrt(T x){if(x<0) x=-x,putchar('-');if(x>9) wrt(x/10);putchar(x%10+48);}
template <typename T> void wrt(T x,char c){wrt(x),putchar(c);}
int x[N],p[N],c[N];
int n,m,dp[N],sumcost[N],sumcnt[N];
int q[N],head,tail;
lb slope(int x,int y){if(sumcnt[y]==sumcnt[x])return (lb)1e18;return ((lb)1.0*dp[y]+sumcost[y]-dp[x]-sumcost[x])/((lb)1.0*sumcnt[y]-sumcnt[x]);}
signed main()
{
    read(n);
    for(int i=1;i<=n;++i)
      read(x[i],p[i],c[i]),sumcnt[i]=sumcnt[i-1]+p[i],sumcost[i]=sumcost[i-1]+p[i]*x[i];
    //head=1,tail=0;
    for(int i=1;i<=n;++i)
      {
        while(head<tail&&slope(q[head],q[head+1])<=x[i]) head++;
        int j=q[head];
        dp[i]=c[i]+(sumcnt[i]-sumcnt[j])*x[i]-(sumcost[i]-sumcost[j])+dp[j];
        while(head<tail&&slope(q[tail],i)<=slope(q[tail-1],q[tail]))tail--; 
        q[++tail]=i;
      }
    int ans = dp[n];
    for(int i=n;i>=1;--i)
    {
        if(p[i]!=0) break;
        ans=min(dp[i],ans);
    }
    wrt(ans);
}
2021/11/18 19:07
加载中...