[CF1111C]Creative Snap

Posted memory-of-winter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1111C]Creative Snap相关的知识,希望对你有一定的参考价值。

题目大意:有一个长度为$2^n(nleqslant30)$的格子,有$k(kleqslant10^5)$个球,分布在这些格子中,有两种消灭格子的方法:

1. 若一段格子长度大于等于$2$,可以对半分开
2. 消灭一段格子,若其中有球,代价为$B imes x imes l$,$l$为格子长度,$x$为球个数;若没有球,代价为$A$

求最小代价

题解:动态开点线段树,直接模拟这个$DP$过程即可。可以把$0$号点代价设为$A$,表示没有球。

卡点:

 

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 100010

long long A, B;
namespace SgT {
#define N (maxn * 18)
	long long V[N];
	int lc[N], rc[N], idx, S[N];
	void insert(int &rt, int l, int r, int pos) {
		if (!rt) rt = ++idx;
		++S[rt];
		if (l == r) {
			V[rt] = B * S[rt];
			return ;
		}
		const int mid = l + r >> 1;
		if (pos <= mid) insert(lc[rt], l, mid, pos);
		else insert(rc[rt], mid + 1, r, pos);
		V[rt] = std::min(B * S[rt] * (r - l + 1), V[lc[rt]] + V[rc[rt]]);
	}
}

int n, k, rt;
int main() {
	scanf("%d%d%lld%lld", &n, &k, &A, &B); n = 1 << n;
	SgT::V[0] = A;
	for (int i = 0, x; i < k; ++i) {
		scanf("%d", &x);
		SgT::insert(rt, 1, n, x);
	}
	printf("%lld
", SgT::V[rt]);
	return 0;
}

  

以上是关于[CF1111C]Creative Snap的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 1111C Creative Snap分治+贪心

CF-1111C-Creative Snap

CF#537 C. Creative Snap /// DFS

C. Creative Snap(分治)

如何将 Firebase 和 Snap Creative Kit 作为 Gradle 依赖项包含在内

CF#462 div1 D:A Creative Cutout