[51nod Round 15 B ] 完美消除
数位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 ] 完美消除的更多相关文章
- bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1788 Solved: 775[Submit][Stat ...
- 无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net
ZOJ1015 题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上). 命题等价于该图是否存在完美消除序列. 所谓完美消除序列:在 vi,v ...
- UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]
UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...
- BestCoder Round#15 1001-Love
http://acm.hdu.edu.cn/showproblem.php?pid=5082 Love Time Limit: 2000/1000 MS (Java/Others) Memory ...
- BZOJ 1006 完美消除序列&最大势算法&弦图
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...
- HYNB Round 15: PKU Campus 2019
HYNB Round 15: PKU Campus 2019 C. Parade 题意 将平面上n*2个点安排在长度为n的两行上. 做法 首先可以忽略每个点之间的影响,只用考虑匹配即可 然后把所以点归 ...
- 51NOD 1623 完美消除 数位DP
题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的 ...
- 51nod 1623 完美消除(数位DP)
首先考虑一下给一个数如何求它需要多少次操作. 显然用一个单调栈就可以完成:塞入栈中,将比它大的所有数都弹出,如果栈中没有当前数,答案+1. 因为数的范围只有0~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 ...
随机推荐
- Ionic2 cordova angular2 打包到Android apk环境搭建
一.前言 前段时间,公司有个APP项目需要支持不同平台,于是采用了Ionic2 + cordova + angular2,在搭建环境过程中遇到了不少问题,刚好最近有时间整理出来. 二.开发环境搭建 参 ...
- android v4兼容包
一句话解释android兼容包就是:支持更多的组件,样式更好看了.好粗糙的解释啊! 我们都知道Android一些SDK比较分裂,为此google官方提供了Android Support Library ...
- 房上的猫:while循环与do-while循环,debug的调试运用
一.循环结构 1.循环不是无休止进行的,满足一定条件的时候循环才会继续,称为"循环条件",循环条件不满足的时候,循环退出 2.循环结构是反复进行相同的或类似的一系列操作,称为&qu ...
- Adb+.net 实现微信跳一跳自动化
第一次用adb,一开始只是想试试看能不能解析出,没有看网上的现有解析方式. 需要安卓机开启usb 调试+电脑运行.打开跳一跳的界面 点击程序 [开始]按钮即可开始,别的按钮都是调试用的 主要流程是用a ...
- Linux知识--初始linux
从今天开始陆续分享Linux的知识 因为服务器基本是Linux的 所以Linux不学明白 Shell命令不熟 会让你的办事效率大打折扣. 一.Linux文件系统 Linux文件系统是从Unix结构 ...
- dlib人脸关键点检测的模型分析与压缩
本文系原创,转载请注明出处~ 小喵的博客:https://www.miaoerduo.com 博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模 ...
- Windows下phpStudy配置独立站点详细步骤
本文讲如何在phpStudy下配置 域名->站点 步骤. 开始之前,我们先添加几个本地域名(host文件),如果有域名映射到主机此步可以跳过,直接看后面的phpStudy配置部分. 首先打开ho ...
- Ubuntu 搭建简单的git server
Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议. 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他 ...
- tomcat 发布简单的html网站
1.建立一个文件夹D:\Demo 2.在Demo目录下,建立一个WEB-INF的文件夹并将web.xml放在里面,D:\Demo\WEB-INF\web.xml 3.将index.html文件放在De ...
- Windows和Linux下换行的不同
因为测试IM会用到一些账号,于是写了一段代码从数据库里把需要的用户名.密码和手机号都一一取了出来,然后放到NotePad++中做进一步的处理. 取用户名.手机号和密码的代码如下: public cla ...