我在帮同学调试代码时,发现自己被hack了。
数据如下:
5
0 1 0
1 0 2
3 0 0
5 1 1
8 1 0
在工厂1,4,5添加仓库时最优,但我的AC代码输出是3
我的代码:
#include<bits/stdc++.h>
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
using ll=long long;
const int N=1e6+5;
const db eps=1e-9;
int n;
ll x[N],p[N],c[N];
ll sxp[N],sp[N];
db X[N],Y[N];
ll dp[N],ans;
int q[N],hd=1,tl=0;
inline db slo(int i,int j){return (Y[j]-Y[i])/(X[j]-X[i]);}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>x[i]>>p[i]>>c[i],sxp[i]=sxp[i-1]+x[i]*p[i],sp[i]=sp[i-1]+p[i];
q[++tl]=0;
for(int i=1;i<=n;i++){
while(hd<tl&&slo(q[hd],q[hd+1])<=x[i]+eps)hd++;
int j=q[hd];
dp[i]=dp[j]+sxp[j]-sxp[i]+(sp[i]-sp[j])*x[i]+c[i];
X[i]=sp[i],Y[i]=dp[i]+sxp[i];
while(hd<tl&&slo(q[tl-1],q[tl])+eps>=slo(q[tl],i))tl--;
q[++tl]=i;
}
int now=n;
ans=dp[n];
while(!p[now]&&now>0)ans=min(ans,dp[--now]);
cout<<ans;
return 0;
}
附datamaker
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=1e5+5;
int n;
mt19937 rnd(time(0));
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
n=rnd()%5+3;
cout<<n<<"\n";
int las=0;
for(int i=1;i<=n;i++){
cout<<las<<" "<<(rnd()&1)<<" "<<rnd()%5<<"\n";
las+=rnd()%3+1;
}
return 0;
}