题意:给定 l,r,kl,r,kl,r,k ,对于一个 kkk 进制数,将数码看成这个位置的石子个数,每将一个石子移动 111 的距离需要 111 的代价。求 [l,r][l,r][l,r] 中的所有数在 kkk 进制下将石子集中在一个位置的最小代价之和。

l≤r≤1015,k≤20l\leq r\leq 10^{15},k\leq 20l≤r≤1015,k≤20

对于序列 {a1,a2,…,an}\{a_1,a_2,\dots,a_n\}{a1​,a2​,…,an​},显然将集中位置从 k−1k-1k−1 移动到 kkk 会减少 ∑i=knai−∑i=1k−1ai\sum_{i=k}^n a_i-\sum_{i=1}^{k-1}a_i∑i=kn​ai​−∑i=1k−1​ai​ 的代价。

枚举最优的位置,卡下前后的和的上下界,就可以数位 dp 了。

然而这个东西十分精神污染,反正我写了一天没写出来。

考虑更优美的做法。发现这个代价是关于集中位置的单峰函数,也就是一次往后移动如果贡献为负,那之后的贡献都为负。

所以有这样一个思路:先统计出放在最高位的总贡献,然后考虑每个移动产生的贡献,如果为正就把它加上。

可以设 dp(p,i,s,lim)dp(p,i,s,lim)dp(p,i,s,lim) 表示从高到低考虑到第 iii 位,如果把未考虑的记为 000,高于 ppp (含)的数码和减去低于 ppp (不含)的数码和为 sss,是否卡上界的总贡献。 p=1p=1p=1 的时候因为要算总贡献,要特殊处理一下。

为什么数位 dp 记忆化搜索这么好写啊……

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
typedef long long ll;
int B;
int a[55],cnt,p;
ll f[55][20005];
ll dfs(int i,int s,int lim)
{if (!i||s<0) return max(s,0);if (!lim&&~f[i][s]) return f[i][s];int mx=lim? a[i]:B-1;ll ans=0;for (int x=0;x<=mx;x++)ans+=dfs(i-1,s+(p==1? x*(i-1):(i<p? -x:x)),lim&&x==mx);if (!lim) f[i][s]=ans;return ans;
}
inline ll calc(ll n)
{cnt=0;while (n) a[++cnt]=n%B,n/=B;memset(f,-1,sizeof(f)),p=1;ll ans=dfs(cnt,0,1);for (p=2;p<=cnt;p++) memset(f,-1,sizeof(f)),ans-=dfs(cnt,0,1);return ans;
}
int main()
{ll l,r;cin>>l>>r>>B;cout<<calc(r)-calc(l-1);return 0;
}

【SCOI2014】方伯伯的商场之旅【数位dp】【单峰函数】相关推荐

  1. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  2. 【BZOJ3598】【SCOI2014】方伯伯的商场之旅(数位dp)

    传送门 似乎做出来之后很简单了 显然对于每一个数都是在带权中点最优 假设先把所有数都移到最后一位 再枚举有多少能往左移更优 考虑显然在找中点的时候能往左移的条件是当前位置前缀大于后缀 而前后缀之差的范 ...

  3. bzoj 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1399  Solved: 627 [Submit][ ...

  4. [bzoj 3594] [Scoi2014]方伯伯的玉米田

    [bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...

  5. 3597: [Scoi2014]方伯伯运椰子

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec   Memory Limit: 64 MB Submit: 388   Solved: 239 [ Submit][ ...

  6. [bzoj3597][SCOI2014]方伯伯运椰子

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MB Submit: 353 Solved: 215 [Submit][Statu ...

  7. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3597 Description 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十 ...

  8. [SCOI2014]方伯伯的OJ

    看到这道题的第一想法就是要用FHQ treap 过了这道题...于是至今尚未成功(华丽的 T 掉了 (╯‵□′)╯︵┻━┻ ).于是附个地址. 然后水一波博客. 题意简介 emmmm...方伯伯脑抽做 ...

  9. bzoj3597: [Scoi2014]方伯伯运椰子【分数规划+费用流】

    Description 四川的方伯伯为了致富,决定引进海南的椰子树. 方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统. 现在用点来表示交通节点,边来表示道路.这样,方伯伯的椰子园就可以看作一个 ...

最新文章

  1. too many indices for tensor of dimension 3
  2. 【SQL Server学习笔记】SQL SERVER 视图
  3. windows下如何查看设备的idVendor(厂商标识)和idProduct(产品标识)?
  4. Python如何进行内存管理?
  5. C# 8.0的三个令人兴奋的新特性 1
  6. js 获得明天0点时间戳_需要知道的JS的日期知识,都在这了
  7. Exchange 2007的自动发现
  8. 8196国开计算机专业英语,电大计算机网络(本)学习周期01任务A_0002答案
  9. linux 查看vcf文件,Linux生信练习4-vcf
  10. 【百度OCR 文字识别篇】好奇怪的SDK108错误,换种方法解决
  11. OS课程 ucore_lab1实验报告
  12. “熊孩子”乱敲键盘就攻破了Linux桌面,大神:17年前我就警告过你们
  13. 面向对象和面向过程有什么区别
  14. python网络爬虫(第八章:图像识别与文字处理)
  15. 【房间墙上凿个洞,看你在干嘛~】安全攻防内网渗透-绕过防火墙和安全检测,搭建DNS隐蔽隧道
  16. 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage
  17. php 全文搜索引擎-讯搜使用
  18. 送给她最最浪漫的表白(Python代码实现)
  19. 阳了?别怕,送上居家办公指南
  20. java 多线程学习笔记(二) -- IO密集型任务

热门文章

  1. 看完后震惊!清华“姚班”创始人的老师究竟有多牛?他说孩子最应该培养这几个思维……...
  2. 这几个关乎我们一生教养的原则,每个人都应该知道。
  3. 2020年,朋友圈的正确打开方式!
  4. 用“谬论”指挥研究方向数十年,是谁让“老年痴呆”至今仍是绝症?
  5. 读书笔记--互联网必读《长尾理论》作者克里斯.安德森
  6. c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
  7. matlab 抽样判决代码,matlab抽样判决器
  8. 多个数求平均数java_[分享]求任意个数的平均数!
  9. linux 装nano命令,linux下安装 nano 如果没有这个命令的话~~可以看下
  10. 通信开源linux,Linux环境进程间通信