[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 ...
随机推荐
- SQL基本查询_子查询(实验四)
SQL基本查询_子查询(实验四) 1.查询所有员工中薪水低于"孙军"的员工姓名和薪水: 2.查询与部门编号为"01"的岗位相同的员工姓名.岗位.薪水及部门号: ...
- 小白的Python之路 day4 生成器并行运算
一.概述 我们已经明白生成器内部的结构,其实就是通过像函数这样的东西实现的! 多线程和单线程:简单来说多线程就是并行运算,单线程就是串行运算 二.生成器执行原理 第一步:生成一个生成器 第二步:执行 ...
- Xamarin Android 中Acitvity如何传递数据
在xamarin android的开发中,activity传递数据非常常见,下面我也来记一下在android中activity之间传递数据的几种方式, Xamarin Android中Activity ...
- glibc-commons 依赖解析 版本错误,xxx is duplicate yyy
glibc-commons 安装了两个版本,导致依赖glibc-commons的很多软件包 被安装了两个版本: 解决办法就是 先清除这些重复的已安装的软件,然后执行 yum update 将 glib ...
- JAVA模板方法
package project01; abstract class MyRuntime{ public final void runtime(){ long starttime =System.cur ...
- Android 7.1 WindowManagerService 屏幕旋转流程分析 (三)
三.屏幕的绘制 performSurfacePlacement()函数来触发window的绘制,这里最大的循环次数是6,当然一般不会到最大次数就会被Scheduled. final void perf ...
- VS2017 调试不能命中断点问题
去掉勾
- Node.js 蚕食计划(二)—— 使用 http 模块搭建 Web 服务器
Node.js 开发的目的就是为了用 JavaScript 编写 Web 服务器程序 这次就来介绍用 http 模块搭建服务器 一.项目构建 每个 Node 程序都可以看作一个模块,而每个模块都应该有 ...
- 通俗易懂的信息熵与信息增益(IE, Information Entropy; IG, Information Gain)
信息熵与信息增益(IE, Information Entropy; IG, Information Gain) 信息增益是机器学习中特征选择的关键指标,而学习信息增益前,需要先了解信息熵和条件熵这两个 ...
- 解决 iPhone 微信 H5 无法自动播放音乐问题
使用 wx sdk 在html导入sdk js文件.(如果网站是https导入的sdk也要使用https!) 然后在 wx.ready 中设置 play 方法并复制给全局变量 fm,当需要使用的时候再 ...