【数位统计】Tickets

有一位售票员给乘客售票。对于每位乘客,他会卖出多张连续的票,直到已卖出的票的编号的数位之和不小于给定的正数K。然后他会按照相同的规则给下一位乘客售票。
—初始时,售票员持有的票的编号是从L到R的连续整数。请你求出,售票员可以售票给多少位乘客。
—数据规模:1 ≤ L ≤ R≤ 1018,1 ≤ K ≤1000。
刘聪论问题,以前做此类题都是按位考虑,可是偏偏此题用树考虑极为方便(居然不满足区间减法)。
由于是十进制,所以划分成十叉树,但是由于“数位之和不小于给定的正数K”,所以不一定等于,则对与一棵子树来说可能前几个节点会给别人,自己又会抢一些节点,因此多记录一维前多少的部分与上一组合并,在转移时将最后一组剩余多少记录一下然后类似线段树找到所需区间进行dp。
一开始我将线段树似的dfs和dp混在一起,结果状态给搞错了,本来想改进结果发现如果dfs与dp在一起则表示的状态量就很大了,所以干脆分开弄,反而清晰了不少。
#include <cstdio>
#include <cstdlib>
#include <cstring>
struct tree {long long a,b;}f[20][200][1000],ans;
const int oo=1073741819;
int g[20][200][1000],s,a[40],b[40],c[40];
long long k,l,r;
tree merge(tree x,tree y) 
{
  x.a+=y.a;
  x.b=y.b;
  return x;
}
void dp(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值