线段树优化dp求调
查看原帖
线段树优化dp求调
392727
rsdbk_husky楼主2021/10/28 12:12

RT

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXn = 1e5;
const int INF = 0x3f3f3f3f3f3f3f3f;

template <typename T>
inline void read(T &a) {
	char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());bool f = c == '-';T x = f ? 0 : (c ^ '0');for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = x * 10 + (c ^ '0');}a = f ? -x : x;
}
template <typename T, typename ...Argv>
inline void read(T &a, Argv &...argv) {
	read(a), read(argv...);
}

int le[MAXn * 4 + 10], ri[MAXn * 4 + 10], add[MAXn * 4 + 10], mn[MAXn * 4 + 10];
#define ls (id << 1)
#define rs (id << 1 | 1)
inline void pushup(int id) {
	mn[id] = min(mn[ls], mn[rs]);
}
inline void pushdown(int id) {
	mn[ls] = mn[ls] + add[id];
	mn[rs] = mn[rs] + add[id];
	add[ls] = add[ls] + add[id];
	add[rs] = add[rs] + add[id];
	add[id] = 0;
}
void Build0(int id, int l, int r) {
	if (l > r) return;
	le[id] = l;
	ri[id] = r;
	if (l == r) {
		;
	} else {
		int mid = (l + r) >> 1;
		Build0(ls, l, mid);
		Build0(rs, mid + 1, r);
	}
}
void Add(int id, int l, int r, int k) {
	if (l > r) return;
	if (le[id] >= l && ri[id] <= r) {
		mn[id] = mn[id] + k;
		add[id] = add[id] + k;
	} else {
		pushdown(id);
		int mid = (le[id] + ri[id]) >> 1;
		if (l <= mid) Add(ls, l, r, k);
		if (r > mid) Add(rs, l, r, k);
		pushup(id);
	}
}
int Eva(int id, int l, int r) {
	if (l > r) return INF;
	if (le[id] >= l && ri[id] <= r) {
		return mn[id];
	} else {
		pushdown(id);
		int mid = (le[id] + ri[id]) >> 1, ans = INF;
		if (l <= mid) ans = Eva(ls, l, r);
		if (r > mid) ans = min(ans, Eva(rs, l, r));
		return ans;
	}
}
#undef ls
#undef rs
int n, W, d[MAXn + 10], sumw[MAXn + 10];
struct Ele {
	int h, idx;
}stk[MAXn + 10]; int top;
int l;
signed main() {
	read(n, W);
	Build0(1, 1, n);
	for (int i = 1, h, w; i <= n; ++i) {
		read(h, w); sumw[i] = sumw[i - 1] + w;
		while (l < i && sumw[l] < sumw[i] - W) ++l;
		while (top && stk[top].h <= h) {
			Add(1, stk[top - 1].idx, stk[top].idx - 1, h - stk[top].h);
			--top;
		}
		stk[++top] = Ele{h: h, idx: i};
		Add(1, i - 1, i - 1, h);
		d[i] = Eva(1, l, i - 1);
		Add(1, i, i, d[i]);
	}
	printf("%lld\n", d[n]);
	return 0;
}
2021/10/28 12:12
加载中...