BZOJ 1096ZJOI 2007仓库建设 DP+斜率优化

Posted abclzr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1096ZJOI 2007仓库建设 DP+斜率优化相关的知识,希望对你有一定的参考价值。

后缀自动机看不懂啊QAQ

放弃了还是看点更有用的东西吧,比如斜率优化DP

先水一道

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000003
#define read(x) x=getint()
using namespace std;
typedef long long LL;
inline LL getint() {
    LL k = 0; int fh = 1; char c = getchar();
    for(; c < ‘0‘ || c > ‘9‘; c = getchar())
        if (c == ‘-‘) fh = -1;
    for(; c >= ‘0‘ && c <= ‘9‘; c = getchar())
        k = k * 10 + c - ‘0‘;
    return k * fh;
}
LL x[N], p[N], c[N], sum[N], b[N], f[N], n, q[N];
inline LL fz(int x, int y) {
	return f[x] + b[x] - f[y] - b[y];
}
inline LL fm(int x, int y) {
	return sum[x] - sum[y];
}
int main() {
	read(n);
	for(int i = 1; i <= n; ++i)
		read(x[i]), read(p[i]), read(c[i]);
	for(int i = 1; i <= n; ++i)
		sum[i] = sum[i - 1] + p[i], b[i] = b[i - 1] + p[i] * x[i];
	int h = 0, t = 1, now;
	for(int i = 1; i <= n; ++i) {
		while (h < t - 1 && fz(q[h + 1], q[h]) < x[i] * fm(q[h + 1], q[h]))
			++h;
		now = q[h];
		f[i] = f[now] + (sum[i] - sum[now]) * x[i] - b[i] + b[now] + c[i];
		while (h < t - 1 && fz(q[t - 1], q[t - 2]) * fm(i, q[t - 1]) > fz(i, q[t - 1]) * fm(q[t - 1], q[t - 2]))
			--t;
		q[t++] = i;
	}
	printf("%lld\n", f[n]);
	return 0;
}

我好蒟蒻啊,省选要爆零!

以上是关于BZOJ 1096ZJOI 2007仓库建设 DP+斜率优化的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)

_bzoj1096 [ZJOI2007]仓库建设斜率优化dp

BZOJ1096-[ZJOI2007]仓库建设

bzoj1096: [ZJOI2007]仓库建设 斜率优化dp

[Bzoj1096][ZJOI2007]仓库建设(斜率优化)

[BZOJ1096] [ZJOI2007] 仓库建设 (斜率优化dp)