首页 > 其他分享 >Luogu P3286 [SCOI2014]方伯伯的商场之旅

Luogu P3286 [SCOI2014]方伯伯的商场之旅

时间:2022-11-19 20:00:30浏览次数:56  
标签:伯伯 le sta P3286 Luogu sum 石子 SCOI2014 LL

题意

方伯伯有一天去参加一个商场举办的游戏。商场派了一些工作人员排成一行。每个人面前有几堆石子。

说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石子的数量,刚好是 \(i\) 写成 \(K\) 进制后的第 \(j\) 位。现在方伯伯要玩一个游戏,商场会给方伯伯两个整数 \(L,R\)。

方伯伯要把位置在 \([L, R]\) 中的每个人的石子都合并成一堆石子。每次操作,他可以选择一个人面前的两堆石子,将其中的一堆中的某些石子移动到另一堆,代价是移动的石子数量 \(\times\) 移动的距离。

商场承诺,方伯伯只要完成任务,就给他一些椰子,代价越小,给他的椰子越多。所以方伯伯很着急,想请你告诉他最少的代价是多少。例如:\(10\) 进制下的位置在 \(12312\) 的人,合并石子的最少代价为:\(1 \times 2 + 2 \times 1 + 3 \times 0 + 1 \times1 + 2 \times 2 = 9\)即把所有的石子都合并在第三堆。

对于 \(100\%\) 的数据,\(1 \le L \le R \le 10^{15}, 2 \le K \le 20\)。

题解

一道很不错的数位dp

首先考虑怎么计算每个人的最少代价. 这里我们要有调整递推的思想.

我们首先计算在\(1\)点的贡献,然后转移到\(2\)的时候,加上\(2-1\)的.

虽然我们也有其他\(O(\log_{k} i)\)的时间复杂度内甚至更简洁的做法.

但是这种方法更有优化空间. 算是一个套路吧.

然后我们可以考虑用数位dp, 分别求一开始\(1\), 和后面\(i - i-1\)的贡献.

如果\(i - i-1 < 0\), 以后只会更劣.

显然这个东西是一个单峰的(中位数证明), 所以解法正确.

代码

点击查看代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#define LL long long
using namespace std;

LL L, R, k, a[60], n, ans, j, f[30][2][10005];

LL dfs(int x, int sta, int sum) {
	if (x == 0) return max(0, sum);
	if (f[x][sta][sum] != -1) return f[x][sta][sum];
	f[x][sta][sum] = 0; int lim = sta ? a[x] : k - 1; LL res = 0;
	for(int i = 0; i <= lim; ++i)
		res += dfs(x - 1, sta && (i == lim), sum + (j == 1 ? (x - 1) * i : ((x >= j ? i : (-i)))));
	if (sum >= 0) f[x][sta][sum] = res;
	return res;
}

LL solve(LL val) {
	for(n = 0; val; val /= k) a[++n] = val % k; // 第n位是高位
	for(j = 1, ans = 0; j <= n; ++j) {
		memset(f, -1, sizeof(f));LL tmp = dfs(n, 1, 0);
		if (tmp < 0) continue;
		ans += (j == 1 ? 1 : -1) * tmp;
	}
	return ans;
}

int main() {
	scanf("%lld%lld%lld", &L, &R, &k);
	printf("%lld\n", solve(R) - solve(L - 1));
	return 0;
}

标签:伯伯,le,sta,P3286,Luogu,sum,石子,SCOI2014,LL
From: https://www.cnblogs.com/absolutey/p/16906894.html

相关文章

  • luogu P7201 [COCI2019-2020#1] Džumbus题解
    须知本题解骨架是本人由官方题解翻译得来的,并补充了一些不详细的地方,修改了一些错误,自己写了每一个子任务的代码(因为官方题解代码和文本不太匹配)。基本信息任务名:Džumb......
  • LUOGU P1363 幻象迷宫
    题干就用这个题来思路开阔一下吧这个题解的hack数据解释的很好,思路解释也不错这个题解的代码写的不错我是第一个题解的第二个错误思路,然后T了9个点,开$O_2$MLE,冲了好几......
  • luoguP1269 信号放大器
    神奇的题目想了3个做法假·贪心、真·DP、真·贪心全部交上去分别获得40、90、100的好成绩蚌埠住了1.假·贪心考虑从孩子节点开始一直到指定的根节点u到中途某个节......
  • 【LuoguP5163】WD与地图
    【LuoguP5163】WD与地图Description有一个\(n\)个点\(m\)条边的有向图每个点有点权\(a_i\)维护三种操作:1.删去\(a\)到\(b\)的边2.\(a_i\)加上\(b\)3.查询\(a\)所在......
  • P3287 [SCOI2014]方伯伯的玉米田
    \(\mathcal{Link}\)显然,每次区间加的一定是一段后缀。设\(f(i,j)\)表示必选第\(i\)个位置用了\(j\)次的最大保留值。\[f(i,j)=\max\{f(k,l)\}(k\leqi,l\leqj,a......
  • luogu P1224 [NOI2013] 向量内积
    题面传送门比较妙妙的题目。首先我们考虑\(k=2\),直接暴力没有优化方式,考虑随机化。我们随机一个向量的排列方式,将第\(i\)个向量和前面的向量求出内积之和\(\bmodk\)的......
  • luogu P4786 [BalkanOI2018]Election
    题面传送门离谱题,结论出奇的简单。首先我们考虑\(O(nq)\)怎么做。显然所有C都要放在最终序列中,然后问题就变成往里面填T。我们考虑第一个T填在能填的最开始的位置上,因......
  • LuoguP1586 题解
    也可以在LuoguP1586(tencentcs.com)获得更好的阅读体验。Luogu_P1586题解一道比较简单的题目,看到求种类数,考虑DP。设\(f_{i,j}\)表示第\(i\)个数划分为\(j\)......
  • Luogu P5816[CQOI2010]内部白点题解
    LinkLuoguP5816Description一个平面直角坐标系内有\(n\)个黑点,其余点为白点,将会进行若干次变换,每次变换会把上下左右方向都有黑点的白点变成黑点,直到找不到符合要求......
  • 【题解】Luogu P8743 【[蓝桥杯 2021 省 A] 异或数列】
    最近刚好在刷博弈论,看到这道题没有题解,所以刚好来水一发题目链接[蓝桥杯2021省A]异或数列题目描述Alice和Bob正在玩一个异或数列的游戏。初始时,Alice和Bob......