bzoj1096题解
2024-09-06 05:36:36
【解题思路】
预处理spi=∑pj(j∈[1,i]),si=si-1+(xi-xi-1)*spi-1表示把工厂1~i-1的产品都运到工厂i的花费。于是把工厂j+1~i的产品都运到工厂i的花费为si-sj-spj*(xi-xj)。
于是易得转移方程:f[i]=min{f[j]+s[i]-s[j]-sp[j]*(x[i]-x[j])+c[i]},转移成同的形式:((f[j]-s[j]+sp[j]*x[j])-(f[k]-s[k]+sp[k]*x[k]))/(sp[j]-sp[k])<x[i]。
因为较优转移方式为min,所以维护一个下凸壳即可。听说题目并没有保证x升序?(可能是我星际)所以假装要先排下序,复杂度O(nlog2n)。
【参考代码】
#include <algorithm>
#define range(i,low,high) for(register int i=(low);i<(high);++i)
#define dange(i,high,low) for(register int i=(high);i>(low);--i)
#define __function__(type) __attribute__((optimize("-O2"))) inline type
#define __procedure__ __attribute__((optimize("-O2"))) inline void
using namespace std; //quick_io {
#include <cctype>
#include <cstdio> __function__(long long) getint()
{
char c=getchar(); for(;!isdigit(c)&&c!='-';c=getchar());
short s=; for(;c=='-';c=getchar()) s*=-; long long r=;
for(;isdigit(c);c=getchar()) r=(r<<)+(r<<)+c-''; return r*s;
}
//} quick_io struct node
{
long long x,p,c;
__procedure__ input() {x=getint(),p=getint(),c=getint();}
__function__(bool) operator<(const node&t)const{return x<t.x;}
}factory[]; int q[]; long long s[]={},sp[]={},f[]; __function__(long long) getDP(const int&i,const int&j)
{
return f[j]+s[i]-s[j]-sp[j]*(factory[i].x-factory[j].x)+factory[i].c;
}
__function__(long long) getUP(const int&j,const int&k)
{
return f[j]-f[k]-s[j]+s[k]+sp[j]*factory[j].x-sp[k]*factory[k].x;
}
__function__(long long) getDOWN(const int&j,const int&k)
{
return sp[j]-sp[k];
} int main()
{
int n=getint(); range(i,,n+) factory[i].input();
range(i,,n+)
{
s[i]=s[i-]+(factory[i].x-factory[i-].x)*sp[i-];
sp[i]=sp[i-]+factory[i].p;
}
int head=,tail=; sort(factory+,factory+n+),f[]=;
range(i,,n+)
{
for(;head+<tail&&
getUP(q[head+],q[head])<factory[i].x*getDOWN(q[head+],q[head]);
++head
);
f[i]=getDP(i,q[head]);
for(;head+<tail&&
getUP(i,q[tail-])*getDOWN(q[tail-],q[tail-])<
getUP(q[tail-],q[tail-])*getDOWN(i,q[tail-]);
--tail
);
q[tail++]=i;
}
return printf("%lld\n",f[n]),;
}
最新文章
- 弹出iframe内嵌页面元素到父页面并全屏化
- [deviceone开发]-do_ImageView实现正圆的示例
- 通过GET方法返回定义的任意对象
- appcan切换帐号无法提交SVN
- HTML5移动Web开发(五)——移动设计之CSS媒介查询
- Android安全机制(2) Android Permission权限控制机制
- codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)
- LitDB文章
- 从零开始学ios开发(七):Delegate,Action Sheet, Alert
- C#01
- 编写isNull isArray isFunction的方法
- 2440裸 Delay(); 和 while(!(rUTRSTAT0 &;amp; 0x2)); 问题
- FreeRTOS源代码的编程标准与命名约定
- ConcurrentHashMap1.8源码分析
- SD卡
- AndroidStudio打包apk,安装出现签名冲突--解决办法
- IPython介绍
- MySQL中的IFNULL,IF,NULLIF函数
- WebDriverAPI(3)
- SVN中Revert changes from this revision 跟Revert to this revision