数位DP。

  比较蛋疼的是,设a[i]表示第i位上数字,比方说a[1]<a[2]>a[3],且a[1]==a[3]时,这两位上的数可以放在一起搞掉。

  所以就在正常的f数组里多开一维,表示后面那些位组成的不增的单调栈中,包含的数字集合。

  f[i][j][k][a]表示i位,首位为j,单调栈数字集合为k,最小消除数为a的数字个数。

  从已知往外推好像好写一点。。

  枚举f[i1][j1][k1][a1],再枚举下一个首位j

  若j<j1: f[i1+1][j][ (k1%2^(j+1))|2^j ][ a1+(2^j&k1?0:1) ]+=f[i1][j1][k1][a1];

  若j==j1:f[i1+1][j][k1][a1]+=f[i1][j1][k1][a1];

  若j>j1:  f[i1+1][j][k1+2^j][a1+1]+=f[i1][j1][k1][a1];

  统计答案时,就在记录一下已确定高位的不减单调栈就行了。。。

  很(jiao)显(wan)而(cai)易(fa)见(xian)的是...j那维是没用的,因为j肯定是k的最大位...所以每个k都对应着唯一的j

  反正都交了。。就懒得改了>_<

 #include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll f[][][][];
int two[],one[];
int i,j,k,n,m,aa;
int s[],st[],top;
ll L,R; inline void prerun(){
register int k1,a1,j;int i1,j1,i;ll now;
for(i=one[]=two[]=;i<;i++)two[i]=two[i-]<<,one[i]=one[i-]<<|;
for(i=;i<;i++)f[][i][two[i]][i!=]=;
for(i1=;i1<;i1++)
for(j1=;j1<;j1++)for(k1=two[j1];k1<=one[j1];k1++)for(a1=;a1<=i1&&a1<=aa;a1++)
if(f[i1][j1][k1][a1]){
now=f[i1][j1][k1][a1];
f[i1+][][][a1]+=now;
for(j=;j<j1;j++)
f[i1+][j][(k1&one[j])|two[j]][a1+!(k1&two[j])]+=now;
if(j1!=)f[i1+][j1][k1][a1]+=now;
for(j=j1+;j<;j++)
f[i1+][j][k1|two[j]][a1+]+=now;
}
}
inline int calc(int k){
register int sm=,i;
for(i=;i<=top;i++)if((st[i]!=st[i-]||i==)&&st[i]>)
if(!(two[st[i]]&k))sm++;
return sm;
}
inline ll get(ll x){
if(!x)return ;
ll tmp=x,ans=;int len=;register int i,j,k;
while(tmp)s[++len]=tmp%,tmp/=;
for(i=;i<len;i++)for(j=;j<=;j++)for(k=two[j];k<=one[j];k++)
ans+=f[i][j][k][aa];
for(j=;j<s[len];j++)for(k=two[j];k<=one[j];k++)
ans+=f[len][j][k][aa];
int pre=,tmpa;st[top=]=s[len];
for(i=len-;i;i--){
if(pre>aa)break;
for(j=;j<s[i];j++)
for(k=two[j];k<=one[j];k++)
if((tmpa=aa-pre-calc(k))>=)
ans+=f[i][j][k][tmpa];
while(top&&st[top]>s[i])pre+=(st[top]!=st[top-]||top==),top--;
st[++top]=s[i];
}
if(pre+calc()==aa)ans++;
return ans;
}
int main(){
scanf("%lld%lld%d",&L,&R,&aa);
prerun();
printf("%lld\n",get(R)-get(L-));
return ;
}

[51nod Round 15 B ] 完美消除的更多相关文章

  1. bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1788  Solved: 775[Submit][Stat ...

  2. 无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net

       ZOJ1015 题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上). 命题等价于该图是否存在完美消除序列. 所谓完美消除序列:在 vi,v ...

  3. UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]

    UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...

  4. BestCoder Round#15 1001-Love

    http://acm.hdu.edu.cn/showproblem.php?pid=5082 Love Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  5. BZOJ 1006 完美消除序列&最大势算法&弦图

    K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...

  6. HYNB Round 15: PKU Campus 2019

    HYNB Round 15: PKU Campus 2019 C. Parade 题意 将平面上n*2个点安排在长度为n的两行上. 做法 首先可以忽略每个点之间的影响,只用考虑匹配即可 然后把所以点归 ...

  7. 51NOD 1623 完美消除 数位DP

    题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的 ...

  8. 51nod 1623 完美消除(数位DP)

    首先考虑一下给一个数如何求它需要多少次操作. 显然用一个单调栈就可以完成:塞入栈中,将比它大的所有数都弹出,如果栈中没有当前数,答案+1. 因为数的范围只有0~9,所以我们可以用一个二进制数来模拟这个 ...

  9. Educational Codeforces Round 15 C. Cellular Network(二分)

    C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. vue+express之前后台分离博客

    说来惭愧,这么久没有更新过博客了,写个项目练练手吧,打算写一个vue+express的博客  可能这个时间说长不长说短不短  写到哪就是哪吧  我采用的是前后台分离  express采用的是mvc,但 ...

  2. JDK 1.8 源码阅读和理解

    根据 一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础” 的指引,决定开始阅读下JDK源码. 本文将作为源码阅读总纲 一.精读部分 java.io java.lang java.util ...

  3. 虚拟机创建流程中neutron代码分析(三)

    前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...

  4. 阅读MDN文档之StylingBoxes(五)

    目录 BoxModelRecap Box properties Overflow Background clip Background origin Outline Advanced box prop ...

  5. Java集合(一) CopyOnWriteArrayList

    CopyOnWriteArrayList 类分析   1. CopyOnWriteArrayList 其中底层实现存放数据是一个Object数组:   private volatile transie ...

  6. tomcat部署项目时省略项目名

    大家也许知道在eclipse上通过新建server来部署项目到tomcat,并且通过server来管理项目的启动配置.server会自动创建启动该项目的xml 如: <Context docBa ...

  7. [编织消息框架][JAVA核心技术]动态代理应用1

    前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...

  8. Webpack 2 视频教程 014 - 深入理解 Webpack 2 中的 loader

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  9. 基于编辑距离来判断词语相似度方法(scala版)

    词语相似性比较,最容易想到的就是编辑距离,也叫做Levenshtein Distance算法.在Python中是有现成的模块可以帮助做这个的,不过代码也很简单,我这边就用scala实现了一版. 编辑距 ...

  10. JavaScript Array 对象方法 以及 如何区分javascript中的toString()、toLocaleString()、valueOf()方法

    1.concat() 2.join() 3.pop() 4.push() 5.reverse() 6.shift() 7.unshift() 8.slice() 9.sort() 10.splice( ...