定义f(x)f(x)为LIS(a0,a1...am)(n=a0+a1×10+...+am×10m,0≤ai≤9,am≠0)LIS(a_0,a_1...a_m)(n = a_0 + a_1\times 10+...+a_m\times 10^m,0\le a_i\le 9,a_m\neq 0)

求∑ni=1f(i)\sum_{i=1}^nf(i)

1≤n≤10151 \le n \le 10^{15}


一眼看过去就是一个数位dpdp,但是我们用怎么样的状态表示最长上升子序列这个东西呢?

考虑到最长上升子序列的二分nlog(n)nlog(n)解法中用到的状态表示dpidp_i表示长ii的最长上升子序列结尾最小的那个序列的结尾,同时保证了dpdp数组的单调性。

因为是严格上升,所以dpdp数组是不重复的。因为序列中的数只有[0,9][0,9]这10个数,我们可以用状态压缩保存dpdp数组有哪几个数,又因为dpdp数组的单调性,所以这个状态表示是唯一的。


因为低位在第一个位置的最长上升子序列不好写,改成了最高位在第一个位置的最长下降子序列

#include<bits/stdc++.h>
using namespace std;#define LL long long
const int maxn = 20;LL dp[maxn][1<<10];
int num[maxn];
int nex[1<<10][10],one[1<<10];int tem[maxn];int getnex(int S,int x){int n = 0;for(int i=9;i>=0;i--) if((S>>i) & 1) tem[n++] = i;one[S] = n;for(int i=0;i<n;i++){if(tem[i] <= x){return (S & (~(1<<tem[i]))) | (1<<x);}}return S | (1<<x);
}void init(){for(int i=0;i<(1<<10);i++){for(int j=0;j<10;j++){nex[i][j] = getnex(i,j);}}
}LL dfs(int pos,bool bnd,int sta){if(pos < 0) return one[sta];LL & ndp = dp[pos][sta];if(!bnd && ~ndp) return ndp;LL ret = 0;int bound = bnd ? num[pos] : 9;for(int i=0;i<=bound;i++){ret += dfs(pos-1,bnd && i == bound,nex[sta][i]);}if(!bnd) ndp = ret;return ret;
}LL cal(LL x){int len = 0;while(x){num[len++] = x % 10;x /= 10;}return dfs(len-1,true,0);
}int main(){int T;init();scanf("%d",&T);LL n;memset(dp,-1,sizeof(dp));while(T-- && ~scanf("%lld",&n)){printf("%lld\n",cal(n)-1);;}return 0;
}

Lonlife 1016 Change of Life相关推荐

  1. mysql中change用法,mysql 中alter的用法以及一些步骤

    mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...

  2. Linux下stat + 文件名后, Access,Modify,Change的含义

    我们首先在一个目录下创建了一个文件使用命令touch file 然后输入命令:stat file,这个时候会输出一系列信息 大家注意红色框中的三个时间 Access : 文件最近一次被访问的时间 Mo ...

  3. java changelistener_ListChangeListener.Change

    表示对Observablelist进行的更改的报告. 更改可能包含一个或多个实际更改,并且必须由next()方法迭代. 每个更改必须是以下之一: 在这种情况下, 排列变化 : wasPermutate ...

  4. jQuery绑定事件的三种常见方式(bind、one、【change、click、keydown、hover】)

    一.bind(type,[data],fn):为每个匹配元素的特定事件绑定对应的事件处理函数. 也可以同时给一个元素绑定多个事件,我们来看一下例子: <!DOCTYPE html> < ...

  5. Oracle CDC (Change Data Capture)更新数据捕获——概述

    Change Data Capture能高效识别并捕获数据的插入.修改和删除,使更新数据供个人或应用使用. CDC从oracle 9i开始引入,//TODO 在11G R2之后的版本里将取消支持,被O ...

  6. 1016. Phone Bills (25)

    时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 去掉非法数据计算账单 A long-distance telep ...

  7. ORACLE HANDBOOK系列之十四:变化通知(Change Notification)

    在App开发的过程中,有些数据访问频率很高但是数据变化不大,我们一般会让它驻留内存以提高访问性能,但是此种机制存在一个问题,那就是如何监测数据的变化,Oracle 10g中引入的 Change Not ...

  8. 差异基因分析:fold change(差异倍数), P-value(差异的显著性)

    做基因表达分析时必然会要做差异分析(DE) DE的方法主要有两种: Fold change t-test fold change的意思是样本质检表达量的差异倍数,log2 fold change的意思 ...

  9. Error in setwd(***) : cannot change working directory

    Error in setwd(***) :   cannot change working directory 目录 Error in setwd(***) :   cannot change wor ...

  10. seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X Y Axis Labels to a Seaborn Plot)

    seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X & Y Axis Labels to a Seaborn Plot) 目录

最新文章

  1. AI一分钟 | 阿里联合蚂蚁金服95亿美元收购饿了么;西湖大学正式获批成立
  2. yolo如何降低loss_从未看过如此通俗易懂的YOLO系列
  3. 02.Python网络爬虫第二弹《http和https协议》
  4. android comparator,Comparator和Comparable实现排序的例子源码及其对比
  5. 纯虚函数--抽象类中的this到底指的是哪个子类实例呢
  6. java 怎么用 string method return数量_java教程之Map应该怎么用
  7. 搭建自己的Unity Package
  8. 协程分析之 context 上下文切换
  9. 计算机统计分析spss试卷,《SPSS计算机统计分析方法》试卷A卷
  10. Win7系统电脑怎么设置桌面壁纸全屏显示
  11. tssd加载lisp_几个有用的CAD的加载程序LISP
  12. handsontable使用及遇到的坑-前言
  13. 安装 Windows 8 跳过密钥的方法
  14. 世硕电子发放员工证件随手扔地上,其实是一种服从性测试
  15. 6.计算机系统能力创新实践,计算机考核要重实践能力、培养创新精神
  16. android 开源 高斯模糊_Android高斯模糊你所不知道的坑
  17. 信息收集(二)IP信息收集
  18. PostGIS 入门
  19. TD源链:让区块链臻于完美
  20. 上海理工大学计算机考研资料汇总

热门文章

  1. 卧龙图说酒:喝酒的人生,是有意义的人生!
  2. NIC不变量检测对抗样本
  3. python123货币转换器_Python之美元大写转换器
  4. 超市选址c语言程序,谈谈超市选址的重要性
  5. NShape(开源矢量图形编辑器) 入门(二)
  6. 触摸屏与usb鼠标同时支持
  7. free top 内存泄漏 内存溢出
  8. C#调用支付宝转账接口 已调通
  9. 信必优荣膺最具影响力服务外包企业、IT技术服务企业、金融服务企业
  10. python查看list的shape_列表list、数组np.array等的len,size,shape操作