您的位置:首页 > 其它

BZOJ 斜率优化 1096: [ZJOI2007]仓库建设

2014-08-28 10:29 204 查看
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1096

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
#include <queue>
#include <vector>
#include <algorithm>
#include <cassert>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define rrep(i,a,b) for(int i=(a);i>=(b);--i)
#define clr(a,x) memset(a,(x),sizeof(a));
#define eps 1e-8
#define LL long long
#define mp make_pair
const int maxn=1000000+5;
const LL inf=1e15;
LL S1[maxn],S2[maxn],dp[maxn][2];
LL X[maxn],P[maxn],C[maxn];
int q[maxn],front,rear;

double up(int j,int k) { return dp[j][1]-X[j]*S1[j]+S2[j]-(dp[k][1]-X[k]*S1[k]+S2[k]); }
double down(int j,int k) { return X[k]-X[j]; }

struct Gong
{
LL X,P,C;
bool operator<(const Gong&g) const { return X>g.X; }
}in[maxn];

int main()
{
int n;
while(scanf("%d",&n)==1) {
rep(i,1,n+1) scanf("%lld%lld%lld",&in[i].X,&in[i].P,&in[i].C);
sort(in+1,in+1+n);
rep(i,1,n+1) X[i]=in[i].X,P[i]=in[i].P,C[i]=in[i].C;
rep(i,1,n+1) S1[i]=S1[i-1]+P[i];
rep(i,1,n+1) S2[i]=S2[i-1]+X[i]*P[i];
//    Dp(n);
front=rear=0; q[rear++]=1;
dp[1][1]=C[1]; dp[1][0]=inf;
rep(i,2,n+1) {
while(rear-front>1) {
int a=q[front],b=q[front+1];
if(up(a,b)/down(a,b)<=S1[i]) ++front;
else break;
}
int j=q[front];
dp[i][0]=dp[j][1]-S2[i]+S2[j]+X[j]*(S1[i]-S1[j]);
dp[i][1]=min(dp[i-1][0],dp[i-1][1])+C[i];
while(rear-front>1) {
int a=q[rear-2],b=q[rear-1],c=i;
if(up(a,b)/down(a,b)>=up(b,c)/down(b,c)) --rear;
else break;
}
q[rear++]=i;
}
printf("%lld\n",min(dp
[0],dp
[1]));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: